private static CompilerResults Compile(string ToCompile) { Dictionary <String, String> providerOptions = new Dictionary <String, String> { { "CompilerVersion", "v3.5" } }; Microsoft.CSharp.CSharpCodeProvider codeProvider = new Microsoft.CSharp.CSharpCodeProvider(providerOptions); System.CodeDom.Compiler.ICodeCompiler icc = codeProvider.CreateCompiler(); string Output = "";// @"mypath"; System.CodeDom.Compiler.CompilerParameters parameters = new System.CodeDom.Compiler.CompilerParameters(); parameters.GenerateExecutable = false; parameters.OutputAssembly = Output; parameters.ReferencedAssemblies.Add("System.Core.dll"); parameters.ReferencedAssemblies.Add("System.Data.dll"); parameters.ReferencedAssemblies.Add("System.XML.Linq.dll"); parameters.ReferencedAssemblies.Add("WD toolbox.dll"); CompilerResults results = icc.CompileAssemblyFromSource(parameters, ToCompile); if (results.Errors.Count == 0) { //System.Diagnostics.Process.Start(Output); } return(results); }
public static object InvokeWebService(string url, string @namespace, string classname, string methodname, object[] args) { try { System.Net.WebClient wc = new System.Net.WebClient(); System.IO.Stream stream = wc.OpenRead(url + "?WSDL"); System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream); System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace); System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider(); System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler(); System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return(mi.Invoke(obj, args)); } catch (Exception ex) { throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace)); } }
/// <summary> /// Function to compile .Net C#/VB source codes at runtime /// </summary> /// <param name="_CodeProvider">Base class for compiler provider</param> /// <param name="_SourceCode">C# or VB source code as a string</param> /// <param name="_SourceFile">External file containing C# or VB source code</param> /// <param name="_ExeFile">File path to create external executable file</param> /// <param name="_AssemblyName">File path to create external assembly file</param> /// <param name="_ResourceFiles">Required resource files to compile the code</param> /// <param name="_Errors">String variable to store any errors occurred during the process</param> /// <returns>Return TRUE if successfully compiled the code, else return FALSE</returns> private bool CompileCode(System.CodeDom.Compiler.CodeDomProvider _CodeProvider, string _SourceCode, string _SourceFile, string _ExeFile, string _AssemblyName, string[] _ResourceFiles, ref string _Errors) { // set interface for compilation System.CodeDom.Compiler.ICodeCompiler _CodeCompiler = _CodeProvider.CreateCompiler(); // Define parameters to invoke a compiler System.CodeDom.Compiler.CompilerParameters _CompilerParameters = new System.CodeDom.Compiler.CompilerParameters(); if (_ExeFile != null) { // Set the assembly file name to generate. _CompilerParameters.OutputAssembly = _ExeFile; // Generate an executable instead of a class library. _CompilerParameters.GenerateExecutable = true; _CompilerParameters.GenerateInMemory = false; // Esto será lo que haya que cambiar para que se cargue en memoria } else if (_AssemblyName != null) { // Set the assembly file name to generate. _CompilerParameters.OutputAssembly = _AssemblyName; // Generate an executable instead of a class library. _CompilerParameters.GenerateExecutable = false; _CompilerParameters.GenerateInMemory = false; } else { // Generate an executable instead of a class library. _CompilerParameters.GenerateExecutable = false; _CompilerParameters.GenerateInMemory = true; } // Generate debug information. //_CompilerParameters.IncludeDebugInformation = true; // Set the level at which the compiler // should start displaying warnings. _CompilerParameters.WarningLevel = 3; // Set whether to treat all warnings as errors. _CompilerParameters.TreatWarningsAsErrors = false; // Set compiler argument to optimize output. _CompilerParameters.CompilerOptions = "/optimize"; // Set a temporary files collection. // The TempFileCollection stores the temporary files // generated during a build in the current directory, // and does not delete them after compilation. _CompilerParameters.TempFiles = new System.CodeDom.Compiler.TempFileCollection(".", true); if (_ResourceFiles != null && _ResourceFiles.Length > 0) { foreach (string _ResourceFile in _ResourceFiles) { // Set the embedded resource file of the assembly. _CompilerParameters.EmbeddedResources.Add(_ResourceFile); } } try { // Invoke compilation System.CodeDom.Compiler.CompilerResults _CompilerResults = null; if (_SourceFile != null && System.IO.File.Exists(_SourceFile)) { // soruce code in external file _CompilerResults = _CodeCompiler.CompileAssemblyFromFile(_CompilerParameters, _SourceFile); } else { // source code pass as a string _CompilerResults = _CodeCompiler.CompileAssemblyFromSource(_CompilerParameters, _SourceCode); } if (_CompilerResults.Errors.Count > 0) { // Return compilation errors _Errors = ""; foreach (System.CodeDom.Compiler.CompilerError CompErr in _CompilerResults.Errors) { _Errors += "Line number " + CompErr.Line + ", Error Number: " + CompErr.ErrorNumber + ", '" + CompErr.ErrorText + ";\r\n\r\n"; } // Return the results of compilation - Failed return(false); } else { // no compile errors _Errors = null; } } catch (Exception _Exception) { // Error occurred when trying to compile the code _Errors = _Exception.Message; return(false); } // Return the results of compilation - Success return(true); }
private void btnCompileRun_Click(object sender, EventArgs e) { string code = null; code += "using System;\r\n"; code += "using TextIndex;\r\n"; code += "using System.Collections;\r\n"; code += "using System.Data;\r\n"; code += "public class TestParser : SiteParser{ "; code += " public override string Parse(HtmlDocument document) { "; code += " " + textCode.Text; code += " } "; code += "}"; // CodeDOM'dan C# compiler'ı elde edelim Microsoft.CSharp.CSharpCodeProvider cp = new Microsoft.CSharp.CSharpCodeProvider(); System.CodeDom.Compiler.ICodeCompiler ic = cp.CreateCompiler(); // compiler parametrelerini ayarlayalım System.CodeDom.Compiler.CompilerParameters cpar = new System.CodeDom.Compiler.CompilerParameters(); cpar.GenerateInMemory = true; cpar.GenerateExecutable = false; cpar.ReferencedAssemblies.Add("system.dll"); cpar.ReferencedAssemblies.Add("System.Drawing.dll"); cpar.ReferencedAssemblies.Add("System.Windows.Forms.dll"); cpar.ReferencedAssemblies.Add("System.Data.dll"); cpar.ReferencedAssemblies.Add(Application.ExecutablePath); // kodu derletim ve sonuçları alalım System.CodeDom.Compiler.CompilerResults cr = ic.CompileAssemblyFromSource(cpar, code); // eğer derleme hatası varsa bu hataları bir bir gösterelim. foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { // hata mesajı, hatanın oluştuğu satır, önceki üç satır ve sonraki üç satırı içeren // bir hata mesajı hazırlayalım. string[] srcArr = code.Split('\n'); string errMessage = ce.ErrorText + " at line " + (ce.Line - 1) + "\n\n"; for (int i = ce.Line - 3; i < ce.Line + 3; i++) { if (i < 0 || i >= srcArr.Length) { continue; } errMessage += i + " " + srcArr[i] + "\n"; } // hatayı gösterelim MessageBox.Show(errMessage); return; } // kod hatasız derlendiyse test işlemlerine başlayalım. if (cr.Errors.Count == 0 && cr.CompiledAssembly != null) { // test edilecek iki koda (sınıfa) ait tipleri elde edelim. Type type = cr.CompiledAssembly.GetType("TestParser"); try { SiteParser parser = (SiteParser)Activator.CreateInstance(type); string result = parser.Parse(document); textBox2.Text = result; } catch (Exception ex) { MessageBox.Show(ex.Message); } } }