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

说来惭愧,周末跟一个同事讨论.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();

    }

}
支持TerryLee的创业产品Worktile
Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
https://worktile.com
原文地址:https://www.cnblogs.com/Terrylee/p/313616.html