C#的动态编译执行

在运行时编写代码并编译执行。如下所示。

 

Open按钮打开任意文本文件,并载入到TextBox。载入后可更改。

Compile按钮进行编译和执行。具体代码如下。

C#的动态编译执行

 

 

代码
   
     
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

 

 

 

你可能感兴趣的:(动态编译)