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#内存程序的过程相关推荐

  1. Linux下如何将源文件逐步编译成目标文件的过程

    前言 请讲一下linux如何源文件逐步编译成可执行文件. 解答 首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程.  以hello.c 程序为例 # include <stdio ...

  2. 基础为零?如何将 C++ 编译成 WebAssembly

    作者| 张翰(门柳) 出品|阿里巴巴新零售淘系技术部 本文知识点提炼: 1.如何使用 Emscripten 把 C++ 编译成 wasm. 2.如何使用 wasi-sdk 把 C++ 编译成 wasm ...

  3. 【CLR的执行模型:将源代码编译成托管模块】

    CLR:由多种不同编程语言使用的运行库 托管模块:中间语言和元数据 非托管语言:C/C++,不过此为特殊,可以写成托管代码 托管语言:C# 托管模块 1,PE32/PE32+头:PE32运行在win3 ...

  4. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  5. as 怎么将多个cpp文件代码编译成so_一段C代码,是如何编译运行的?

    想一下, 我们想把源文件放到内存中执行,应该怎么做? 直觉上我们需要将源代码翻译成机器语言,以某种结构组织代码和数据.再让CPU去按这种结构读取指令.如果是多个源文件, 我们可能还需要按某种方式将它们 ...

  6. Linux文本编译工具VIM详解

    Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 1>.vi: 全称Visual editor,即文本编 ...

  7. aspx文件编译成DLL文件的原理

    前言 Asp.net不是asp的简单升级,而是微软.Net计划中的一个重要组成部分,它依托.Net的多语言与强大的类库支持,引进了服务端HTML控件与WEB控件,自动处理控件的客户端与服务端的 交互, ...

  8. 【转载】把aspx文件编译成DLL文件-.NET教程,Asp.Net开发

    前言 asp.net不是asp的简单升级,而是微软.net计划中的一个重要组成部分,它依托.net的多语言与强大的类库支持,引进了服务端html控件与web控件,自动处理控件的客户端与服务端的 交互, ...

  9. python源代码不需要编译成什么-python需要编译么

    一个经常听见的问题,那就是:Python是解释型的语言吗?它会被编译吗?这个问题没有想象中那么好回答.和很多人认识世界一样,习惯以一个简单的模型去评判一些事物.而事实上,里面包含了很多很多的细节. 通 ...

  10. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

最新文章

  1. ios利用block实现回调示例
  2. Objective-C设计模式——外观Faced(接口适配)
  3. c-nominated = ((rcheck-use_candidate) || c-nominated);
  4. “@react-navigation/native“).createNavigatorFactory) is not a function.
  5. Linux工程师新法宝:在Visual Studio上用C++ 写Linux
  6. OOB套接字传输实例(达不到预期结果)
  7. Springboot启动扩展点超详细总结,再也不怕面试官问了
  8. 《计算机网络》学习笔记 ·003【数据链路层】
  9. 汇编指令对应的机器码_汇编语言输出“welcome to you!”
  10. 视频软件会声会影支持哪些视频格式?
  11. 为什么说Mac比windows更安全?
  12. WiFi Interface 的 name 如何获取到
  13. 绘制一幅蓝图_如何给新家绘制一张生活蓝图
  14. java 获取数组(二维数组)长度实例程序
  15. HDU 4173(计算几何
  16. html的重置按钮reset无反应,reset() 按钮没有反应???
  17. win10升级助手_详解win7升级win10系统方法
  18. 11n/11ac/11ax 速率速查表
  19. #CSDN软件工程师能力认证学习精选# Hadoop基础知识学习
  20. 47:WAF绕过-漏洞发现之代理池指纹被动探针

热门文章

  1. Spark大数据计算框架知识总结
  2. Android Xml布局常见问题总结
  3. 计算机解决的气象复杂问题,自动气象站更换时计算机遇到的疑难问题及解决办法...
  4. 这个开源的视频编辑项目,有点6~
  5. php接口ip验证,php – IP地址验证帮助
  6. Selenium爬虫 -- 无界面爬取:无头模式及其他参数
  7. 施乐7556_富士施乐Fuji Xerox WorkCentre 7556 驱动
  8. o(n)复杂度下实现数组去除重复项
  9. Boot2Docker 安装运行出现客户端与服务端版本不一致的解决办法
  10. 在springBoot项目中使用activiti