1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace CompilerTest 7 { 8 // Compiler 9 class MyCompilter 10 { 11 // Provider 12 private Microsoft.CSharp.CSharpCodeProvider Provider; 13 // CompilerParameters 14 private System.CodeDom.Compiler.CompilerParameters cps; 15 // Default Libs 16 public string[] defaultLibs = { "System.dll" }; 17 18 // Singleton 19 private static MyCompilter instance = null; 20 private MyCompilter() { 21 Provider = new Microsoft.CSharp.CSharpCodeProvider(); 22 } 23 public static MyCompilter Instance() { 24 if (instance == null) { 25 instance = new MyCompilter(); 26 } 27 return instance; 28 } 29 30 // CompilerParameters 31 private void CreateCps(string[] libs) { 32 // 编译参数 33 cps = new System.CodeDom.Compiler.CompilerParameters(); 34 // 是否生成 Exe 文件 35 cps.GenerateExecutable = false; 36 // 生成在内存中 37 cps.GenerateInMemory = true; 38 // 添加引用 39 cps.ReferencedAssemblies.AddRange(defaultLibs); 40 if (libs != null) { 41 cps.ReferencedAssemblies.AddRange(libs); 42 } 43 44 // 将 生成的 的 Dll 文件,保存到硬盘中 45 cps.OutputAssembly = "d:/tmp.dll"; 46 } 47 48 // Eval String 49 public System.Reflection.Assembly Compile(string[] Sources, string[] libs = null) { 50 // Compiler Results 51 System.CodeDom.Compiler.CompilerResults cr; 52 // Create Compiler Parameters 53 CreateCps(libs); 54 // 开始编译 55 cr = Provider.CompileAssemblyFromSource(cps, Sources); 56 57 // 如果没有错误的话. 将 生成的 Assembly 返回 58 if (cr.Errors.Count == 0) { 59 return cr.CompiledAssembly; 60 } 61 return null; 62 } 63 } 64 65 class Program 66 { 67 static void Main(string[] args) { 68 string code = @" 69 using System; 70 71 class ExpressionCalculate 72 { 73 public void Calculate() 74 { 75 Console.WriteLine(""kaoooooo,asdfl""); 76 } 77 } 78 "; 79 string code2 = @" 80 using System; 81 82 class ExpressionCalculate2 83 { 84 public void Calculate2() 85 { 86 Console.WriteLine(""kaooortrtrtrtooo,atytytysdfl""); 87 } 88 } 89 "; 90 91 // 对字符串,进行编译 92 System.Reflection.Assembly type = MyCompilter.Instance().Compile(new string[] { code,code2 }); 93 // 通过,编译后得到的 Assembly 反射创建其中的一个类,得到一个 Object 类型的对象 94 object obj = type.CreateInstance("ExpressionCalculate2"); 95 // 通过 这个 Obj 的 GetType().GetMethod() 方法 按名称得到它的里面的方法 96 System.Reflection.MethodInfo method = obj.GetType().GetMethod("Calculate2"); 97 // 调用这个方法 98 method.Invoke(obj, null); 99 } 100 } 101 }