動態編譯,聽起來很酷,不是嗎?
1.什麼是動態編譯
所謂動態編譯是由兩個字組成的:動態+編譯。很顯然,我們是想實現臨時地 給出一段代碼,然後將其編譯成程序集(可以是在內存中,也可以是輸出一個真 正的dll)
2.什麼時候需要用到動態編譯?
呃,這個問題有點難,簡單地說,就是要動態的時候啦。呵呵。我們有的時候 需要提供系統這麼一種靈活性,即有的類型沒有辦法預先寫好,而是要根據情況 動態編譯。這麼說吧,例如我們希望根據數據庫裡面一個表的結構,動態編譯出 來一個對應的類型。
3.如何使用動態編譯。下面是一個很簡單的例子
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
ICodeCompiler compiler = new CSharpCodeProvider ().CreateCompiler();//得到一個CSharp的編譯器
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add ("system.data.dll");
cp.ReferencedAssemblies.Add ("system.xml.dll");
cp.GenerateExecutable = false;//這是指示說我們輸出的程序 集是dll,而不是exe
cp.GenerateInMemory = true; //這是指示在內存中創建該程序 集
StringBuilder sb = new StringBuilder();
sb.Append("using System; \n");
sb.Append("public class MyClass{");
sb.Append("public string HelloWorld(){");
sb.AppendFormat("return {0};", "\"Hello,world\"");
sb.Append("}}"); //這裡為止,我們構造了一個動 態的類型,它有一個方法是HelloWorld
CompilerResults result = compiler.CompileAssemblyFromSource(cp, sb.ToString()); //執行編譯
object _compilerobject = result.CompiledAssembly.CreateInstance("MyClass");
MethodInfo method = _compilerobject.GetType().GetMethod ("HelloWorld");
Console.WriteLine(method.Invoke(_compilerobject, null).ToString());
Console.Read();
}
}