在运行时编写代码并编译执行。如下所示。
Open按钮打开任意文本文件,并载入到TextBox。载入后可更改。
Compile按钮进行编译和执行。具体代码如下。
代码
1 using System; 2 using System.Windows.Forms; 3 using System.IO; 4 using System.CodeDom.Compiler; 5 using Microsoft.CSharp; 6 using System.Reflection; 7 8 namespace DynamicCodeCompiler 9 { 10 public partial class Form1 : Form 11 { 12 string dynammicCode; 13 14 public Form1() 15 { 16 InitializeComponent(); 17 } 18 19 //打开文件并载入代码 20 private void button1_Click(object sender, EventArgs e) 21 { 22 OpenFileDialog ofd = new OpenFileDialog(); 23 ofd.Multiselect = false; 24 25 if (ofd.ShowDialog()==DialogResult.OK) 26 { 27 FileStream fs = new FileStream(ofd.FileName,FileMode.Open); 28 StreamReader sr = new StreamReader(fs); 29 dynammicCode = sr.ReadToEnd(); 30 textBox1.Text = dynammicCode; 31 } 32 } 33 34 private void button2_Click(object sender, EventArgs e) 35 { 36 if (textBox1.Text != null) 37 { 38 // 1.CSharpCodePrivoder 39 CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); 40 41 // 2.ICodeComplier 42 ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler(); 43 44 // 3.CompilerParameters 45 CompilerParameters objCompilerParameters = new CompilerParameters(); 46 47 //此处添加引用,使用的代码必须在此处有引用否则会编译错误 48 objCompilerParameters.ReferencedAssemblies.Add("System.dll"); 49 objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); 50 objCompilerParameters.GenerateExecutable = false; 51 objCompilerParameters.GenerateInMemory = true; 52 53 // 4.CompilerResults 54 CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, textBox1.Text); 55 56 if (cr.Errors.HasErrors) 57 { 58 Console.WriteLine("编译错误:"); 59 foreach (CompilerError err in cr.Errors) 60 { 61 Console.WriteLine(err.ErrorText); 62 } 63 } 64 else 65 { 66 // 通过反射,调用HelloWorld的实例。此处命名空间和类硬编码为Test.Program。 67 Assembly objAssembly = cr.CompiledAssembly; 68 object objDynamicAssenmbly = objAssembly.CreateInstance("Test.Program"); 69 MethodInfo objMI = objDynamicAssenmbly.GetType().GetMethod("Main"); 70 71 //Console.WriteLine(objMI.Invoke(objDynamicAssenmbly, null)); 72 objMI.Invoke(objDynamicAssenmbly, null); 73 } 74 75 } 76 } 77 } 78 } 79
|
请发表评论