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

本文介绍如何使用C#进行动态编译,包括添加必要的引用、创建编译代码、设置编译参数及编译过程等关键步骤,并演示了一个简单的动态编译示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

第一步:添加引用

using System.Reflection; <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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 <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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();

    }

}

转载于:https://www.cnblogs.com/Terrylee/archive/2006/01/09/313616.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值