Blue Dream

记录成长的每一个脚印,写下漫长的程序人生
随笔 - 4, 文章 - 121, 评论 - 1, 阅读 - 89514
  首页  :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

Posted on   Dennis  阅读(430)  评论(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();

    } 

(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示