程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 利用CodeDom和反射動態編譯並執行程序集

利用CodeDom和反射動態編譯並執行程序集

編輯:關於ASP.NET

動態編譯,聽起來很酷,不是嗎?

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();
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved