当前位置: 首页 > news >正文

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

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

    }

}

相关文章:

  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • 类的覆盖
  • BGP协议学习精华(二)
  • 工作、激情、挑战
  • 开放源码发展史上的重要事件
  • 3月广州IT媒体杀人游戏比赛,就在本周五晚
  • AJAX淋漓尽致的发挥(Google个性化主页 VS. Windows Live.COM)站在互联网浪尖上窃喜...
  • The C++ Programming Language
  • PDF N-Up Maker:一个把PDF转成小册子或者把多个页面放到一个页面上的工具(免费,免Acrobat,命令行模式)...
  • 界面设计测试规范
  • 如何控制横向和纵向滚动条的显隐?
  • 第一本Enterprise Library书籍上市
  • 智能实验室-贴霸(Postio) 2.5.0.250
  • 利用消息机制实现.NET AOP(面向方面编程)--利用ServerContextSink实现多截获
  • Atlas学习手记(8):调用本地Web Service简单介绍
  • [nginx文档翻译系列] 控制nginx
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【笔记】你不知道的JS读书笔记——Promise
  • Flannel解读
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java的Interrupt与线程中断
  • java小心机(3)| 浅析finalize()
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • laravel 用artisan创建自己的模板
  • Linux各目录及每个目录的详细介绍
  • python docx文档转html页面
  • Python3爬取英雄联盟英雄皮肤大图
  • ubuntu 下nginx安装 并支持https协议
  • Vue.js-Day01
  • vue2.0项目引入element-ui
  • 关于字符编码你应该知道的事情
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 如何设计一个微型分布式架构?
  • 算法-图和图算法
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 《天龙八部3D》Unity技术方案揭秘
  • 我们雇佣了一只大猴子...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # 飞书APP集成平台-数字化落地
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###STL(标准模板库)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (HAL库版)freeRTOS移植STMF103
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (生成器)yield与(迭代器)generator
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net FrameWork简介,数组,枚举
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net通用权限框架B/S (三)--MODEL层(2)
  • ?.的用法