示例#1
0
        /// <summary>
        ///     Compile .NET script to .Net assembly (.dll)
        /// </summary>
        /// <param name="script">CS script</param>
        /// <param name="converter"></param>
        /// <param name="assembly"></param>
        /// <param name="originalScript"></param>
        /// <param name="inMemory"></param>
        /// <returns>Filename to .dll assembly</returns>
        internal void CompileFromDotNetText(string script, IScriptConverter converter, string assembly,
            string originalScript, bool inMemory)
        {
            string ext = "." + converter.Name;

            if (!inMemory)
            {
                // Output assembly name
                scriptCompileCounter++;
                try
                {
                    File.Delete(assembly);
                }
                catch (Exception e) // NOTLEGIT - Should be just FileIOException
                {
                    AddError("Unable to delete old existing " +
                             "script-file before writing new. Compile aborted: " +
                             e);
                    return;
                }
            }

            // DEBUG - write source to disk
            string srcFileName = Path.Combine(m_scriptEngine.ScriptEnginesPath,
                                              Path.GetFileNameWithoutExtension(assembly) + ext);
            if (WriteScriptSourceToDebugFile)
            {
                try
                {
                    File.WriteAllText(srcFileName, script);
                }
                catch (Exception ex) //NOTLEGIT - Should be just FileIOException
                {
                    MainConsole.Instance.Error("[Compiler]: Exception while " +
                                               "trying to write script source to file \"" +
                                               srcFileName + "\": " + ex);
                }
            }

            // Do actual compile
            CompilerParameters parameters = new CompilerParameters {IncludeDebugInformation = true};

            string rootPath =
                Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);

            if (rootPath != null)
                parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                 "WhiteCore.ScriptEngine.WhiteCoreDotNetEngine.dll"));
            parameters.ReferencedAssemblies.Add("System.dll");
            parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            if (rootPath != null)
            {
                parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                 "WhiteCore.Framework.dll"));
                parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                 "WhiteCore.BotManager.dll"));
                parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                 "OpenMetaverseTypes.dll"));
            }

            parameters.ReferencedAssemblies.AddRange(m_referencedFiles.ToArray());

            parameters.GenerateExecutable = false;
            parameters.GenerateInMemory = inMemory;
            parameters.OutputAssembly = assembly;
            parameters.IncludeDebugInformation = CompileWithDebugInformation;
            //parameters.WarningLevel = 1; // Should be 4?
            parameters.TreatWarningsAsErrors = false;

            CompilerResults results = converter.Compile(parameters, WriteScriptSourceToDebugFile,
                                                        WriteScriptSourceToDebugFile ? srcFileName : script);
            parameters = null;
            //
            // WARNINGS AND ERRORS
            //

            if (results.Errors.Count > 0)
            {
                try
                {
                    File.WriteAllText(srcFileName, script);
                }
                catch (Exception ex) //NOTLEGIT - Should be just FileIOException
                {
                    MainConsole.Instance.Error("[Compiler]: Exception while " +
                                               "trying to write script source to file \"" +
                                               srcFileName + "\": " + ex);
                }

                foreach (CompilerError CompErr in results.Errors)
                {
                    string severity = CompErr.IsWarning ? "Warning" : "Error";
                    // Show 5 errors max, but check entire list for errors

                    string errtext = String.Empty;
                    string text = CompErr.ErrorText;
                    int LineN = 0;
                    int CharN = 0;
                    converter.FindErrorLine(CompErr, PositionMap, originalScript, out LineN, out CharN);
                    //This will crash some viewers if the pos is 0,0!
                    if (LineN <= 0 && CharN <= 0)
                    {
                        CharN = 1;
                        LineN = 1;
                    }

                    // The Second Life viewer's script editor begins
                    // countingn lines and columns at 0, so we subtract 1.
                    errtext += String.Format("({0},{1}): {3}: {2}\n",
                                             LineN, CharN, text, severity);
                    if (severity == "Error")
                        AddError(errtext);
                    else
                        AddWarning(errtext);
                }
            }
            results = null;
            if (m_errors.Count != 0) // Quit early then
                return;

            //  On today's highly asynchronous systems, the result of
            //  the compile may not be immediately apparent. Wait a
            //  reasonable amount of time before giving up on it.

            if (!inMemory)
            {
                if (!File.Exists(assembly))
                {
                    for (int i = 0; i < 500 && !File.Exists(assembly); i++)
                    {
                        Thread.Sleep(10);
                    }
                    AddError("No compile error. But not able to locate compiled file.");
                }
            }
        }
示例#2
0
        /// <summary>
        ///   Compile .NET script to .Net assembly (.dll)
        /// </summary>
        /// <param name = "Script">CS script</param>
        /// <returns>Filename to .dll assembly</returns>
        internal void CompileFromDotNetText(string Script, IScriptConverter converter, string assembly,
                                            string originalScript, bool inMemory)
        {
            string ext = "." + converter.Name;

            if (!inMemory)
            {
                // Output assembly name
                scriptCompileCounter++;
                try
                {
                    File.Delete(assembly);
                }
                catch (Exception e) // NOTLEGIT - Should be just FileIOException
                {
                    AddError("Unable to delete old existing " +
                             "script-file before writing new. Compile aborted: " +
                             e);
                    return;
                }
            }

            // DEBUG - write source to disk
            string srcFileName = Path.Combine(m_scriptEngine.ScriptEnginesPath,
                                              Path.GetFileNameWithoutExtension(assembly) + ext);

            if (WriteScriptSourceToDebugFile)
            {
                try
                {
                    File.WriteAllText(srcFileName, Script);
                }
                catch (Exception ex) //NOTLEGIT - Should be just FileIOException
                {
                    MainConsole.Instance.Error("[Compiler]: Exception while " +
                                               "trying to write script source to file \"" +
                                               srcFileName + "\": " + ex);
                }
            }

            // Do actual compile
            CompilerParameters parameters = new CompilerParameters {
                IncludeDebugInformation = true
            };


            string rootPath =
                Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);

            if (rootPath != null)
            {
                parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                 "Aurora.ScriptEngine.AuroraDotNetEngine.dll"));
            }
            parameters.ReferencedAssemblies.Add("System.dll");
            if (rootPath != null)
            {
                parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                 "Aurora.Framework.dll"));
                parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                 "OpenMetaverseTypes.dll"));

                if (converter.Name == "yp")
                {
                    parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
                                                                     "OpenSim.Region.ScriptEngine.Shared.YieldProlog.dll"));
                }
            }

            parameters.ReferencedAssemblies.AddRange(m_referencedFiles.ToArray());

            parameters.GenerateExecutable      = false;
            parameters.GenerateInMemory        = inMemory;
            parameters.OutputAssembly          = assembly;
            parameters.IncludeDebugInformation = CompileWithDebugInformation;
            //parameters.WarningLevel = 1; // Should be 4?
            parameters.TreatWarningsAsErrors = false;

            CompilerResults results = converter.Compile(parameters, WriteScriptSourceToDebugFile,
                                                        WriteScriptSourceToDebugFile ? srcFileName : Script);

            parameters = null;
            //
            // WARNINGS AND ERRORS
            //

            if (results.Errors.Count > 0)
            {
                try
                {
                    File.WriteAllText(srcFileName, Script);
                }
                catch (Exception ex) //NOTLEGIT - Should be just FileIOException
                {
                    MainConsole.Instance.Error("[Compiler]: Exception while " +
                                               "trying to write script source to file \"" +
                                               srcFileName + "\": " + ex);
                }

                foreach (CompilerError CompErr in results.Errors)
                {
                    string severity = CompErr.IsWarning ? "Warning" : "Error";
                    // Show 5 errors max, but check entire list for errors

                    string errtext = String.Empty;
                    string text    = CompErr.ErrorText;
                    int    LineN   = 0;
                    int    CharN   = 0;
                    converter.FindErrorLine(CompErr, PositionMap, originalScript, out LineN, out CharN);
                    //This will crash some viewers if the pos is 0,0!
                    if (LineN <= 0 && CharN <= 0)
                    {
                        CharN = 1;
                        LineN = 1;
                    }


                    // The Second Life viewer's script editor begins
                    // countingn lines and columns at 0, so we subtract 1.
                    errtext += String.Format("({0},{1}): {3}: {2}\n",
                                             LineN, CharN, text, severity);
                    if (severity == "Error")
                    {
                        AddError(errtext);
                    }
                    else
                    {
                        AddWarning(errtext);
                    }
                }
            }
            results = null;
            if (m_errors.Count != 0) // Quit early then
            {
                return;
            }

            //  On today's highly asynchronous systems, the result of
            //  the compile may not be immediately apparent. Wait a
            //  reasonable amount of time before giving up on it.

            if (!inMemory)
            {
                if (!File.Exists(assembly))
                {
                    for (int i = 0; i < 500 && !File.Exists(assembly); i++)
                    {
                        Thread.Sleep(10);
                    }
                    AddError("No compile error. But not able to locate compiled file.");
                }
            }
        }