如何将一段文本编译成C#内存程序的过程
string code = null;// 1. 生成要编译的代码。(示例为了简单直接从程序集内的资源中读取) Stream stram = typeof(CodeDOM).Assembly.GetManifestResourceStream("TestOptimizeReflection.用户手册.txt"); using( StreamReader sr = new StreamReader(stram) ) {code = sr.ReadToEnd(); }//Console.WriteLine(code);// 2. 设置编译参数,主要是指定将要引用哪些程序集 CompilerParameters cp = new CompilerParameters(); cp.GenerateExecutable = false; cp.GenerateInMemory = true; cp.ReferencedAssemblies.Add("System.dll"); cp.ReferencedAssemblies.Add("OptimizeReflection.dll");// 3. 获取编译器并编译代码 // 由于我的代码使用了【自动属性】特性,所以需要 C# .3.5版本的编译器。 // 获取与CLR匹配版本的C#编译器可以这样写:CodeDomProvider.CreateProvider("CSharp")Dictionary<string, string> dict = new Dictionary<string, string>(); dict["CompilerVersion"] = "v3.5"; dict["WarnAsError"] = "false";CSharpCodeProvider csProvider = new CSharpCodeProvider(dict); CompilerResults cr = csProvider.CompileAssemblyFromSource(cp, code);// 4. 检查有没有编译错误 if( cr.Errors != null && cr.Errors.HasErrors ) {foreach( CompilerError error in cr.Errors )Console.WriteLine(error.ErrorText);return; }// 5. 获取编译结果,它是编译后的程序集 Assembly asm = cr.CompiledAssembly;
整个过程分为5个步骤,它们已用注释标识出来了,这里不再重复了。
如何调用编译结果
前面的代码把一段文本字符串编译成了程序集,现在还有最后一个问题:如何调用编译结果?
答案:有二种方法,
1. 直接调用方法。
2. 实例化程序集中的类型,以接口方式调用方法。
其实这二种方法都需要使用反射,用反射定位到要调用的类型和方法。
第一种方法要求在生成代码时,生成的类名和方法名是明确的,在调用方法时,我们有二个选择:
1. 用反射的方式调用(这里只是一次反射)。
2. 为方法生成委托(用上篇博客介绍的方法),然后基于委托调用。
第二种方法要求在生成代码时,首先要定义一个接口,保证生成的代码能实现指定的接口,
然而用反射找到要调用的类型名称,用反射或者委托调用构造方法创建类型实例,最后基于接口去调用。
我们熟悉的ASPX页面就是采用了这种方式来实现的。
这二种方法也可以这样区分:
1. 如果生成的方法是静态方法,应该选择第一种方法。
2. 如果生成的方法是实例方法,那么选择第二种方法是合理的。
对于前面的示例,我采用了第一种方法了,因为类名和方法名称都是事先确定的而且实现起来比较简单。
// 6. 找到目标方法,并调用 Type t = asm.GetType("OptimizeReflection.用户手册"); MethodInfo method = t.GetMethod("Main"); method.Invoke(null, null);
参考:http://www.cnblogs.com/fish-li/archive/2013/02/24/2924673.html#_labelStart
转载于:https://www.cnblogs.com/x-poior/p/7550675.html
如何将一段文本编译成C#内存程序的过程相关推荐
- Linux下如何将源文件逐步编译成目标文件的过程
前言 请讲一下linux如何源文件逐步编译成可执行文件. 解答 首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程. 以hello.c 程序为例 # include <stdio ...
- 基础为零?如何将 C++ 编译成 WebAssembly
作者| 张翰(门柳) 出品|阿里巴巴新零售淘系技术部 本文知识点提炼: 1.如何使用 Emscripten 把 C++ 编译成 wasm. 2.如何使用 wasi-sdk 把 C++ 编译成 wasm ...
- 【CLR的执行模型:将源代码编译成托管模块】
CLR:由多种不同编程语言使用的运行库 托管模块:中间语言和元数据 非托管语言:C/C++,不过此为特殊,可以写成托管代码 托管语言:C# 托管模块 1,PE32/PE32+头:PE32运行在win3 ...
- java 源码分析_Java 源代码编译成 Class 文件的过程分析
原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...
- as 怎么将多个cpp文件代码编译成so_一段C代码,是如何编译运行的?
想一下, 我们想把源文件放到内存中执行,应该怎么做? 直觉上我们需要将源代码翻译成机器语言,以某种结构组织代码和数据.再让CPU去按这种结构读取指令.如果是多个源文件, 我们可能还需要按某种方式将它们 ...
- Linux文本编译工具VIM详解
Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 1>.vi: 全称Visual editor,即文本编 ...
- aspx文件编译成DLL文件的原理
前言 Asp.net不是asp的简单升级,而是微软.Net计划中的一个重要组成部分,它依托.Net的多语言与强大的类库支持,引进了服务端HTML控件与WEB控件,自动处理控件的客户端与服务端的 交互, ...
- 【转载】把aspx文件编译成DLL文件-.NET教程,Asp.Net开发
前言 asp.net不是asp的简单升级,而是微软.net计划中的一个重要组成部分,它依托.net的多语言与强大的类库支持,引进了服务端html控件与web控件,自动处理控件的客户端与服务端的 交互, ...
- python源代码不需要编译成什么-python需要编译么
一个经常听见的问题,那就是:Python是解释型的语言吗?它会被编译吗?这个问题没有想象中那么好回答.和很多人认识世界一样,习惯以一个简单的模型去评判一些事物.而事实上,里面包含了很多很多的细节. 通 ...
- 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?
在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...
最新文章
- ios利用block实现回调示例
- Objective-C设计模式——外观Faced(接口适配)
- c-nominated = ((rcheck-use_candidate) || c-nominated);
- “@react-navigation/native“).createNavigatorFactory) is not a function.
- Linux工程师新法宝:在Visual Studio上用C++ 写Linux
- OOB套接字传输实例(达不到预期结果)
- Springboot启动扩展点超详细总结,再也不怕面试官问了
- 《计算机网络》学习笔记 ·003【数据链路层】
- 汇编指令对应的机器码_汇编语言输出“welcome to you!”
- 视频软件会声会影支持哪些视频格式?
- 为什么说Mac比windows更安全?
- WiFi Interface 的 name 如何获取到
- 绘制一幅蓝图_如何给新家绘制一张生活蓝图
- java 获取数组(二维数组)长度实例程序
- HDU 4173(计算几何
- html的重置按钮reset无反应,reset() 按钮没有反应???
- win10升级助手_详解win7升级win10系统方法
- 11n/11ac/11ax 速率速查表
- #CSDN软件工程师能力认证学习精选# Hadoop基础知识学习
- 47:WAF绕过-漏洞发现之代理池指纹被动探针
热门文章
- Spark大数据计算框架知识总结
- Android Xml布局常见问题总结
- 计算机解决的气象复杂问题,自动气象站更换时计算机遇到的疑难问题及解决办法...
- 这个开源的视频编辑项目,有点6~
- php接口ip验证,php – IP地址验证帮助
- Selenium爬虫 -- 无界面爬取:无头模式及其他参数
- 施乐7556_富士施乐Fuji Xerox WorkCentre 7556 驱动
- o(n)复杂度下实现数组去除重复项
- Boot2Docker 安装运行出现客户端与服务端版本不一致的解决办法
- 在springBoot项目中使用activiti