我曾开发过一个.NET应用,需要在运行中动态的创建EXE文件,当时查了很多资料后才顺利实现,有一些心得,整理出来。

  要从你的.NET应用程序中动态的生成一个汇编你有两种选择:CodeDom和Reflection.Emit。在这篇文章中我将比较二者的不同,以便你作出哪种方法才是最适合你的选择。

  CodeDom和Reflection.Emit的最大不同就是CodeDom可以产生C#、VB.NET、Visual J#,以及其他.NET语言,而Reflection.Emit则是产生原始的中间语言(IL—Intermediate Language)语句。CodeDom不需要深入的IL知识,因此使用起来会容易的多。不利的方面是你被限制为一套所有语言都可以访问的动作和类型集,这消除了对超载操作或是语言专有的方言的使用。有利的方面是通过使用一个不同的代码提供者,你可以很容易的在不同的输出语言间进行切换。

  Reflection.Emit是极端强大的,它可以做许多CodeDom不能做的事情,因为它允许你编写任何合法的IL语句。Reflection.Emit的最大障碍就是它要求你理解并能够编写MSIL。Reflection.Emit为你提供了把项目连同真正的MSIL指令压入堆栈和从堆栈中弹出的能力。这在某些时候是有益的,但它也可能成为一个缺点,因为这失去了更高级语言所提供的高效的生产力。

  这个代码例子(C#写的)利用CodeDom建立了一个带有一个返回的Main,这个CodeDom产生一个高级的.NET语言:

  CodeEntryPointMethod main = new CodeEntryPointMethod();

  main.Statements.Add(new System.CodeDom.CodeMethodReturnStatement());

  这是同样的Main,但是是用Reflection.Emit来建立的,它产生原始的IL:

  MethodBuilder methodbuilder = typeBuilder.DefineMethod("Main", MethodAttributes.HideBySig | MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(string[]) });

  ILGenerator ilGenerator = methodbuilder.GetILGenerator();

  ilGenerator.Emit(OpCodes.Ret);

  assemblyBuilder.SetEntryPoint(methodbuilder, PEFileKinds.ConsoleApplication);

  这里有一些明显的不同:CodeDom有一个类可以用来创建一个入口点,而Reflection.Emit代码必须手工建立方法并设置入口点。来看看返回:再一次,CodeDom有一个类可以用来做这个工作,而Reflection.Emit代码必须为返回而输出IL指令。

  你到底应该使用CodeDom还是Reflection.Emit依赖于你的情况。

  在下列情况中你应该使用CodeDom:

  • 编写一个代码生成工具。
  • 任何时候当你希望产生C#、VB.NET或任何其他高级语言时。
  • 使用C#或VB.NET代码片断时。

  在下列情况中你应该使用Reflection.Emit:

  • 需要严密的控制IL的优化。
  • 要执行不服从公共语言规范的动作,比如不安全的代码。

  假如你的汇编生成工作不属于前面所述类目中的一个,而你只需要动态的生成汇编,则你可以使用这些生成技术中的任何一种。在大多数的情况下,CodeDom将是更好的选择,因为它更容易使用,并且可以生成许多不同的语言。

  这二者都是强大的工具,用于不同的场合。你只需遵循这一基本的指导方针:如果你正在编写工具或是需要更高级的代码生成,则使用CodeDom;如果你需要对你的生成汇编进行低级控制,则使用Reflection.Emit。

转载于:https://www.cnblogs.com/jnnybob/p/3511125.html

.NET程序在运行中创建EXE文件的技术相关推荐

  1. java中 exe是什么文件_从文件位置运行Java中的.exe文件

    从文件位置运行Java中的.exe文件 我必须从我的Java程序打开一个.exe文件. 所以我试着下面的代码第一. Process process = runtime.exec("c:\\p ...

  2. 电脑中所有exe文件无法运行解决方案

    电脑中所有exe文件无法运行.通过系统恢复无法解决毛病,后来才想起肯定是exe文件关联被改动,只有通过修改注册表才能改回来.要修改注册表就要运行regedit.exe文件,这也是一个exe文件,也无法 ...

  3. js如何在浏览器中运行php文件下载,JavaScript_用JS在浏览器中创建下载文件,但受限于浏览器,很多情况下 - phpStudy...

    用JS在浏览器中创建下载文件 但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开->另存为.如下面这个链接: file.js 用户点击这个链接的时候,浏览器会打开并显示链接指向的文件 ...

  4. ABBYY在MS Office中创建PDF文件的方法

    2019独角兽企业重金招聘Python工程师标准>>> ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以 ...

  5. Loadrunner11录制过程中报错:由于另一个程序正在运行中,此操作无法完成

    第一次安装LR11录制没有问题,第二次录制也没有问题,后面第二天录制就出现了如下截图的现象  报错内容:由于另一个程序正在运行中,此操作无法完成.请选择"切换到"来激活正在运行中的 ...

  6. Qt直接运行生成的exe文件提示“缺少Qt5Core.dll”的解决办法

    Qt直接运行生成的exe文件提示"缺少Qt5Core.dll"的解决办法 [错误描述] 在QtCreator下,程序可以正常运行,但是当关闭QtCreator后,在"de ...

  7. VsCode终端无法运行编译生成的exe文件解决方法

    #VsCode终端无法运行编译生成的exe文件解决方法 问题描述 g++编译生成exe文件,在默认终端中无法运行,包括直接运行test也不可 * 原因&解决方法 原因: 此时VsCode使用的 ...

  8. VirtualBox问题——无法在父文件夹中创建虚拟文件夹

    创建新系统提示无法在父文件夹中创建虚拟文件夹 解决:以管理员的身份运行VirtualBox

  9. Ubuntu中创建GIF文件

      编写<Canvas事件处理及示例代码分析>时发现,鼠标移动时显示坐标以及循环小球示例的演示图做成动图形式最能展示程序效果,但由于不知道怎么在Ubuntu中创建动图,只能以静态图形方式展 ...

最新文章

  1. 串的顺序存储结构c语言版,数据结构C语言版串的定长顺序存储表示和实现.doc
  2. 无法为新的Android ActionBar支持找到Theme.AppCompat.Light
  3. LeetCode刷题中遇到的一些知识点
  4. Robot framework 引入 Selenium2Library 类库:
  5. Oracle数据库监听配置|转|
  6. c 向html页面传值,html页面之间的传值,获取元素和方法的调用
  7. RAC 之 RMAN 备份
  8. 微信Android终端SDK新手使用指南
  9. 根据可信计算机系统评估准则 用户,根据可信计算机系统评估准则(TESEC),用户能定义访问控制要求的自.._简答题试题答案...
  10. SMB协议端口号,Windows文件共享协议
  11. windows搭建SVN服务器
  12. Windows华丽变身MAC OS X
  13. Web数据挖掘小论文
  14. 在 WindowMobile 上的模拟LED 显示屏插件(转)
  15. echarts饼图legend标识位置
  16. 游轮旅游是三亚旅游的未来
  17. 东子破解的quartz7月2号找到的很好这个
  18. 基于微信小程序的垃圾分类小程序(源码已开源)
  19. Java Web小课程3——写servlet
  20. latex缩进与对齐_latex 换行后缩进

热门文章

  1. Discuz X1.5 X2.5 X3 UC_KEY Getshell Write PHPCODE into config/config_ucenter.php Via /api/uc.php Vul
  2. IOS开发笔记(1)---Hello World
  3. java 蓝桥杯历届试题 分糖果(题解)
  4. java线程池 的方法_JAVA线程池的实现方法
  5. Spark Streaming之容错机制以及事务语义
  6. Spark源码分析之BlockManagerMaster
  7. (15)System Verilog系统随机函数
  8. (2)FPGA面试技能提升篇(Perl脚本)
  9. Verilog HDL组合逻辑与时序逻辑区别
  10. JAVA常见业务参加解决方案_大话业务场景与解决方案-做任务