【學習】從.txt文件讀取生成編譯代碼。
阿新 • • 發佈:2018-04-23
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文件讀取生成編譯代碼。