C#的动态编译执行
在运行时编写代码并编译执行。如下所示。
Open按钮打开任意文本文件,并载入到TextBox。载入后可更改。
Compile按钮进行编译和执行。具体代码如下。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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