1. 程式人生 > >.Net 動態編譯(c# 腳本)

.Net 動態編譯(c# 腳本)

art 生成 from 是否 tex () 成對 RM 命名空間

1 用.NET提供的類動態編譯代碼字符串,生成DLL存於內存中,加載到程序域

2 用反射的方式調用這個DLL

將要被編譯和執行的代碼讀入並以字符串方式保存
聲明CSharpCodeProvider對象實例
調用CSharpCodeProvider實例的CompileAssemblyFromSource方法編譯
用反射生成被生成對象的實例(Assembly.CreateInstance)
調用其方法

https://blog.csdn.net/clb929/article/details/51385399

應用:

1 獲取編碼字符串

  string strSourceCode = System.IO.File.ReadAllText("./TextFile1.txt");

2 創建代碼生成/編譯器訪問實例

   CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

  CompilerParameters objCompilerParameters = new CompilerParameters();

  //程序集的引用(程序集路徑)
  objCompilerParameters.ReferencedAssemblies.Add("System.dll");

  //是否需要將生成的文件(dll)放入內存

  objCompilerParameters.GenerateInMemory = true;


  CompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, strSourceCode);

3 通過反射調用剛才加載到內存的庫,調用其方法

  Assembly objAssembly = cr.CompiledAssembly;

  //命名空間.類名稱
  object objClass = objAssembly.CreateInstance("DyTest.Class1");

  object[] objCodeParms = new object[1];
  objCodeParms[0] = "Allan.";

  //調用方法

  string strResult = (string)objClass.GetType().InvokeMember("Go", BindingFlags.InvokeMethod, null, objClass, objCodeParms);

  

.Net 動態編譯(c# 腳本)