1. 程式人生 > >如何用C 動態編譯 執行程式碼

如何用C 動態編譯 執行程式碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

 在開始之前,先熟悉幾個類及部分屬性、方法:CSharpCodeProviderICodeCompilerCompilerParametersCompilerResultsAssembly



  一、CSharpCodeProvider
    提供對C#程式碼生成器和程式碼編譯器的例項的訪問。如果要動態生成VB程式碼,可以使用VBCodeProvider

    CreateCompiler():獲取編譯器的例項。

  二、ICodeCompiler
    定義用於呼叫原始碼編譯的介面或使用指定編譯器的CodeDOM樹。每種編譯方法都接受指示編譯器的CompilerParameters物件,並返回指示編譯結果的CompilerResults物件。

    CompilerAssemblyFromSource(CompilerParameters option, string source)
:使用指定的編譯器,從包含原始碼的字串設定編譯程式集。

  三、CompilerParameters
    
表示用於呼叫編譯器的引數。

    ReferencedAssemblies:獲取當前專案所引用的程式集。Add方法為程式集新增引用。
    GenerateExecutable:獲取或設定一個值,該值指示是否生成可執行檔案。若此屬性為false,則生成DLL,預設是false。
    GenerateInMemory:獲取或設定一個值,該值指示是否在記憶體中生成輸出。

  四、CompilerResults
    表示從編譯器返回的編譯結果。

    CompiledAssembly:獲取或設定以編譯的程式集,Assembly型別。

  五、Assembly

    就是程式集了(不知道如何描述了)。

  大致瞭解了以上知識之後,就可以使用C#動態的編譯並執行程式碼了,一下是一段示例程式:

  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. namespace ConsoleApplication1 
  9. {
  10.     public class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             // 1.CSharpCodePrivoder
  15.             CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
  16.             // 2.ICodeComplier
  17.             ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
  18.             // 3.CompilerParameters
  19.             CompilerParameters objCompilerParameters = new CompilerParameters();
  20.             objCompilerParameters.ReferencedAssemblies.Add("System.dll");
  21.             objCompilerParameters.GenerateExecutable = false;
  22.             objCompilerParameters.GenerateInMemory = true;
  23.             // 4.CompilerResults
  24.             CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());
  25.             if (cr.Errors.HasErrors)
  26.             {
  27.                 Console.WriteLine("編譯錯誤:");
  28.                 foreach (CompilerError err in cr.Errors)
  29.                 {
  30.                     Console.WriteLine(err.ErrorText);
  31.                 }
  32.             }
  33.             else
  34.             {
  35.                 // 通過反射,呼叫HelloWorld的例項
  36.                 Assembly objAssembly = cr.CompiledAssembly;
  37.                 object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
  38.                 MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
  39.                 Console.WriteLine(objMI.Invoke(objHelloWorld, null));
  40.             }
  41.             Console.ReadLine();
  42.         }
  43.         static string GenerateCode()
  44.         {
  45.             StringBuilder sb = new StringBuilder();
  46.             sb.Append("using System;");
  47.             sb.Append(Environment.NewLine);
  48.             sb.Append("namespace DynamicCodeGenerate");
  49.             sb.Append(Environment.NewLine);
  50.             sb.Append("{");
  51.             sb.Append(Environment.NewLine);
  52.             sb.Append("    public class HelloWorld");
  53.             sb.Append(Environment.NewLine);
  54.             sb.Append("    {");
  55.             sb.Append(Environment.NewLine);
  56.             sb.Append("        public string OutPut()");
  57.             sb.Append(Environment.NewLine);
  58.             sb.Append("        {");
  59.             sb.Append(Environment.NewLine);
  60.             sb.Append("             return /"Hello world!/";");
  61.             sb.Append(Environment.NewLine);
  62.             sb.Append("        }");
  63.             sb.Append(Environment.NewLine);
  64.             sb.Append("    }");
  65.             sb.Append(Environment.NewLine);
  66.             sb.Append("}");
  67.             string code = sb.ToString();
  68.             Console.WriteLine(code);
  69.             Console.WriteLine();
  70.             return code;
  71.         }
  72.     }
  73. }
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述