1 using System;
 2 using System.Reflection;
 3 using System.Globalization;
 4 using Microsoft.CSharp;
 5 using System.CodeDom;
 6 using System.CodeDom.Compiler;
 7 using System.Text;
 8 
 9 namespace ConsoleApplication1
10 {
11     public class Program
12     {
13         static void Main(string[] args)
14         {
15             // 1.CSharpCodePrivoder
16             CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
17 
18             // 2.ICodeComplier
19             ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
20 
21             // 3.CompilerParameters
22             CompilerParameters objCompilerParameters = new CompilerParameters();
23             objCompilerParameters.ReferencedAssemblies.Add("System.dll");
24             objCompilerParameters.GenerateExecutable = false;
25             objCompilerParameters.GenerateInMemory = true;
26 
27             // 4.CompilerResults
28             CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());
29 
30             if (cr.Errors.HasErrors)
31             {
32                 Console.WriteLine("编译错误:");
33                 foreach (CompilerError err in cr.Errors)
34                 {
35                     Console.WriteLine(err.ErrorText);
36                 }
37             }
38             else
39             {
40                 // 通过反射,调用HelloWorld的实例
41                 Assembly objAssembly = cr.CompiledAssembly;
42                 object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
43                 MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
44                 object res = objMI.Invoke(objHelloWorld, null);
45                 bool? bol = false;
46                 bol= res as bool?;
47                 Console.WriteLine(bol);
48             }
49 
50             Console.ReadLine();
51         }
52 
53         static string GenerateCode()
54         {
55             StringBuilder sb = new StringBuilder();
56             sb.Append("using System;");
57             sb.Append(Environment.NewLine);
58             sb.Append("namespace DynamicCodeGenerate");
59             sb.Append(Environment.NewLine);
60             sb.Append("{");
61             sb.Append(Environment.NewLine);
62             sb.Append("    public class HelloWorld");
63             sb.Append(Environment.NewLine);
64             sb.Append("    {");
65             sb.Append(Environment.NewLine);
66             sb.Append("        public bool OutPut()");
67             sb.Append(Environment.NewLine);
68             sb.Append("        {");
69             sb.Append(Environment.NewLine);
70             sb.Append("             return 1<2;");
71             sb.Append(Environment.NewLine);
72             sb.Append("        }");
73             sb.Append(Environment.NewLine);
74             sb.Append("    }");
75             sb.Append(Environment.NewLine);
76             sb.Append("}");
77 
78             string code = sb.ToString();
79             Console.WriteLine(code);
80             Console.WriteLine();
81 
82             return code;
83         }
84     }
85 }

 

posted on 2012-12-28 14:37  翼鹏  阅读(281)  评论(0)    收藏  举报