1. 程式人生 > >【學習】從.txt文件讀取生成編譯代碼。

【學習】從.txt文件讀取生成編譯代碼。

tab 找到 ret eve 嵌入 IT pan compile ()

技術分享圖片
 1  string code = null;
 2                 String projectName = Assembly.GetExecutingAssembly().GetName().Name;
 3                 // 1. 生成要編譯的代碼。(示例為了簡單直接從程序集內的資源中讀取)
 4                 Stream stram = Assembly.GetExecutingAssembly()
 5                             .GetManifestResourceStream(projectName + "
.code.txt"); 6 using (StreamReader sr = new StreamReader(stram, Encoding.GetEncoding("GB2312"))) 7 { 8 code = sr.ReadToEnd(); 9 } 10 11 //Console.WriteLine(code); 12 13 // 2. 設置編譯參數,主要是指定將要引用哪些程序集
14 CompilerParameters cp = new CompilerParameters(); 15 cp.GenerateExecutable = false; 16 cp.GenerateInMemory = true; 17 cp.ReferencedAssemblies.Add("System.dll"); 18 19 // 3. 獲取編譯器並編譯代碼 20 // 由於我的代碼使用了【自動屬性】特性,所以需要 C# .3.5版本的編譯器。
21 // 獲取與CLR匹配版本的C#編譯器可以這樣寫:CodeDomProvider.CreateProvider("CSharp") 22 23 Dictionary<string, string> dict = new Dictionary<string, string>(); 24 dict["CompilerVersion"] = "v4.0"; 25 dict["WarnAsError"] = "true"; 26 27 CompilerResults cr = new CSharpCodeProvider(dict).CompileAssemblyFromSource(cp, code); 28 29 // 4. 檢查有沒有編譯錯誤 30 if (cr.Errors != null && cr.Errors.HasErrors) 31 { 32 foreach (CompilerError error in cr.Errors) 33 Console.WriteLine(error.ErrorText); 34 35 return; 36 } 37 38 // 5. 獲取編譯結果,它是編譯後的程序集 39 Assembly asm = cr.CompiledAssembly; 40 41 // 6. 找到目標方法,並調用 42 Type t = asm.GetType("demo.test"); 43 MethodInfo method = t.GetMethod("Main"); 44 method.Invoke(null, null);
控制臺源碼 技術分享圖片
 1 using System;
 2 namespace demo
 3 {
 4     public class demoClass
 5     {
 6         public int Id { get; set; }
 7 
 8         public string Name;
 9 
10         public int Add(int a, int b)
11         {
12             return a + b;
13         }
14     }
15 
16     public class test
17     {
18         public static void Main()
19         {
20             Console.WriteLine("ok");
21         }
22     }
23 }
code.txt

註意:需要將code.txt設置為嵌入的資源

【學習】從.txt文件讀取生成編譯代碼。