/// <summary> /// compile source code /// </summary> /// <returns>whether compile is ok</returns> public bool Compile() { bool bolResult = false; bolHasError = false; strCompilerOutput = null; myCompilerErrors = new CompilerErrorCollection(); myResultAssembly = null; this.bsResultAssemblyBinary = null; // add referenced assemblys information this.CompilerParameters.ReferencedAssemblies.Clear(); foreach (string asm in this.ReferenceAssemblies) { this.CompilerParameters.ReferencedAssemblies.Add(asm); } // check domain ResolveEventHandler ResolveHandler = new ResolveEventHandler(myAppDomain_AssemblyResolve); if (myAppDomain != null) { myAppDomain.AssemblyResolve += ResolveHandler; } try { // compile this.CompilerParameters.GenerateExecutable = false; this.CompilerParameters.GenerateInMemory = false; this.CompilerParameters.IncludeDebugInformation = false; strRuntimeAssemblyFileName = this.AssemblyFileName; if (strRuntimeAssemblyFileName == null || strRuntimeAssemblyFileName.Trim().Length == 0) { strRuntimeAssemblyFileName = System.IO.Path.GetTempFileName() + ".dll"; } this.CompilerParameters.OutputAssembly = strRuntimeAssemblyFileName; if (this.CompilerImports != null && this.CompilerImports.Count > 0) { System.Text.StringBuilder opt = new System.Text.StringBuilder(); foreach (string import in this.CompilerImports) { if (opt.Length > 0) { opt.Append(","); } opt.Append(import.Trim()); } opt.Insert(0, " /imports:"); this.CompilerParameters.CompilerOptions = opt.ToString(); }//if if (this.bolOutputDebug) { System.Diagnostics.Debug.WriteLine( ScriptStrings.StartDynamicCompile + "\r\n" + strSourceCode); foreach (string dll in this.CompilerParameters.ReferencedAssemblies) { System.Diagnostics.Debug.WriteLine(ScriptStrings.Reference + ":" + dll); } } CompilerResults result = null; if (this.Language == CompilerLanguage.VB) { Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider(); result = provider.CompileAssemblyFromSource( this.CompilerParameters, strSourceCode); provider.Dispose(); } else if (this.Language == CompilerLanguage.CSharp) { Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); result = provider.CompileAssemblyFromSource( this.CompilerParameters, strSourceCode); provider.Dispose(); } else { throw new Exception(string.Format( ScriptStrings.NotSupportLanguage_Language, this.Language)); } System.Text.StringBuilder myOutput = new System.Text.StringBuilder(); foreach (string line in result.Output) { myOutput.Append("\r\n" + line); } this.strCompilerOutput = myOutput.ToString(); if (this.OutputDebug) { if (this.strCompilerOutput.Length > 0) { System.Diagnostics.Debug.WriteLine( ScriptStrings.DymamicCompilerResult + strCompilerOutput); } } myCompilerErrors = result.Errors; if (result.Errors.HasErrors) { bolResult = false; bolHasError = true; } else { if (this.AutoLoadResultAssembly) { if (this.CompilerParameters.GenerateInMemory) { this.myResultAssembly = result.CompiledAssembly; } else { bsResultAssemblyBinary = null; using (System.IO.FileStream stream = new System.IO.FileStream( this.CompilerParameters.OutputAssembly, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { bsResultAssemblyBinary = new byte[stream.Length]; stream.Read( bsResultAssemblyBinary, 0, bsResultAssemblyBinary.Length); } this.myResultAssembly = myAppDomain.Load( bsResultAssemblyBinary, null, this.CompilerParameters.Evidence); } } bolResult = true; } if (this.PreserveAssemblyFile == false) { if (System.IO.File.Exists(strRuntimeAssemblyFileName)) { System.IO.File.Delete(strRuntimeAssemblyFileName); } } }//if catch (Exception ext) { System.Diagnostics.Debug.WriteLine( string.Format(ScriptStrings.CompileError_Message, ext.Message)); if (bolThrowException) { throw ext; } } if (myAppDomain != null) { myAppDomain.AssemblyResolve -= ResolveHandler; } return(bolResult); }