/// <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."); } } }
/// <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."); } } }