Blue Dream

记录成长的每一个脚印,写下漫长的程序人生
  首页  :: 订阅 订阅  :: 管理

简单了解.NET中的动态编译机制

Posted on 2006-08-17 10:20  Dennis  阅读(450)  评论(0)    收藏  举报
说来惭愧,周末跟一个同事讨论.NET中的动态编译,觉得实现起来可能有困难。一直不知道.NET Framework提供了一个代码文档对象模型(CodeDOM),可以动态的生成代码并动态编译,只是自己孤陋寡闻,没有用过罢了。这里简单的写一下实现步骤,有时间我会详细地写一下这方面的东西。

第一步:添加引用

using System.Reflection; 

using Microsoft.CSharp; 

using System.CodeDom.Compiler;

第二步:创建需要编译的代码

string MyCodeString=@" 

public class MyTest

{

    public static string GetTestString()

    {

        string MyStr = ""This is a Dynamic Compiler Demo!"";

        return MyStr; 

    } 

}";

第三步:实现动态编译

CompilerParameters compilerParams = new CompilerParameters(); 

        

 ///编译器选项设置

compilerParams.CompilerOptions = "/target:library /optimize"; 

 

///编译时在内存输出

compilerParams.GenerateInMemory = true; 

 

///生成调试信息

compilerParams.IncludeDebugInformation = false; 

        

 ///添加相关的引用

compilerParams.ReferencedAssemblies.Add("mscorlib.dll"); 

compilerParams.ReferencedAssemblies.Add("System.dll");

 

ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler(); 

 

///编译

CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams,MyCodeString);

第四步:输出编译结果

///创建程序集

Assembly asm = results.CompiledAssembly; 

        

///获取编译后的类型

object objMyTestClass = asm.CreateInstance("MyTest");

Type MyTestClassType=objMyTestClass.GetType(); 

 

///输出结果

Console.WriteLine(MyTestClassType.GetMethod("GetTestString").Invoke(objMyTestClass,null)); 

Console.ReadLine();

至此,一个简单的动态编译程序就完了,我们看到输出的结果为:

This is a Dynamic Compiler Demo!

完整的程序清单:

using System; 

 

using System.Reflection; 

using Microsoft.CSharp; 

using System.CodeDom.Compiler; 

 

public class MyDynamicCompiler 

{

    public static void Main()

    {   

        ///需要编译的字符串

        string MyCodeString=@" 

        public class MyTest

        {

            public static string GetTestString()

            {

                string MyStr = ""This is a Dynamic Compiler Demo!"";

                return MyStr; 

            } 

        }";

 

        CompilerParameters compilerParams = new CompilerParameters(); 

        

        ///编译器选项设置

        compilerParams.CompilerOptions = "/target:library /optimize"; 

 

        ///编译时在内存输出

        compilerParams.GenerateInMemory = true; 

 

        ///生成调试信息

        compilerParams.IncludeDebugInformation = false; 

        

        ///添加相关的引用

        compilerParams.ReferencedAssemblies.Add("mscorlib.dll"); 

        compilerParams.ReferencedAssemblies.Add("System.dll");

 

        ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler(); 

 

        ///编译

        CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams,MyCodeString); 

        

        ///创建程序集

        Assembly asm = results.CompiledAssembly; 

        

        ///获取编译后的类型

        object objMyTestClass = asm.CreateInstance("MyTest");

        Type MyTestClassType=objMyTestClass.GetType(); 

 

        ///输出结果

        Console.WriteLine(MyTestClassType.GetMethod("GetTestString").Invoke(objMyTestClass,null)); 

        Console.ReadLine();

    }