之前看过Dapper(使用到了Emit), CYQ.Data(另一种思路,没有使用Emit)类的框架之后, 也想自己做一个小框架玩一下, 不过此时能力太过欠缺, 做不了Cyq.Data或者PDF.Net此类的框架, 所以开始了学习之路. 先制定一个能达到的小目标吧, 从Emit开始.

可能很多人还不知道Emit是个什么鬼, 但是听说过EmitMapper的肯定有不少, Emit的概念, 我这里就不多说了, 可以看一下别人的博文(下面的链接里面就有)

一、使用场景

Emit的使用场景了,通常我们在下面几种情形时可以选择使用Emit来实现:

1.  运行中动态的创建类型、模块等,同时又需要提高效率(可以动态编译一次,然后就不用再处理了).

2 .延迟绑定对象的使用。

3 . 工具插件及IDE的开发等。

4.   ORM的实现。

5.   减少反射的性能损失。

二、小示例

以下部分转载自 : http://www.cnblogs.com/gjhjoy/p/3627243.html (若侵权, 请与我联系, 删除此部分内容)

static void Main(string[] args)
{
//1.构建程序集
var asmName = new AssemblyName("Test");
var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave); //2.创建模块
var mdlBldr = asmBuilder.DefineDynamicModule("Elvinle", "Elvinle.exe"); //3.定义类
var typeBldr = mdlBldr.DefineType("Hello", TypeAttributes.Public); //4.定义类成员(方法,属性等等)
//public void SayHello(){}
var methodBldr = typeBldr.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, null, null); //5.构建方法体
//获取il生成器
var il = methodBldr.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello, HelloWorld!");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
il.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
il.Emit(OpCodes.Pop);//读入的值会被推送至evaluation stack,而本方法是没有返回值的,因此,需要将栈上的值抛弃
il.Emit(OpCodes.Ret); //调用CreateType来完成类型的创建
var t = typeBldr.CreateType();
//设置入口点为SayHello(), -- 相当于Main()
asmBuilder.SetEntryPoint(t.GetMethod("SayHello"));
asmBuilder.Save("Elvinle.exe");
}

结果如下:

以下部分转载自 : http://www.cnblogs.com/Mervin/archive/2013/04/05/reflection-3.html  (若侵权, 请与我联系, 删除此部分内容)

使用Emit常用的几个类如下:

类名 用途
AssemblyBuilder  用来定义和创建动态的程序集
ConstructorBuilder  用来创建动态类的构造函数
CustomAttributeBuilder   用来创建用户自定义的特性
MethodBuilder        用来创建动态类的方法,也可创建构造函数,因为构造函数本身也是一个特殊的方法
ModuleBuilder    用来创建动态程序集中的模块
TypeBuilder    用来定义和创建动态类的新实例
DynamicMethod   用来创建可动态编译和执行的动态方法
ILGenerator         用来生成中间语言,即MSIL指令
OpCodes  提供 Microsoft 中间语言 (MSIL) 指令的字段表示形式

首先来看下使用Emit的一般步骤:

1. 创建一个程序集。

2. 在程序集内创建一个模块。

3. 在模块内创建动态类。

4. 为动态类添加动态方法,属性,事件,等等。

5. 生成相关的IL代码。

6. 返回创建的类型或是持久化保存到硬盘中。

三、指令明细, 有点类似 汇编

由于之前电脑vs安装的是英文版的, 对于一些OpCodes指令, 有一些看的不是很懂, 所以附上一个中文版的吧

地址:http://files.cnblogs.com/files/elvinle/OpCodes.rar

最新文章

  1. Intellij IDEA14 下添加ExtJS提示支持
  2. Linux学习笔记总结--ssh认证登录
  3. oracle中的层级递归查询操作
  4. cannot be deleted directly via the port API: has device owner network:floatingip
  5. JavaScript 总结
  6. mysql函数date_format统计刷选按年月日统计的数据
  7. Session中超时时长设置
  8. android:由URL载入中ImageView
  9. 关于Java中volatile关键字笔记
  10. SNS团队Beta阶段第七次站立会议(2017.5.28)
  11. iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决
  12. 【Android】onNewIntent调用时机
  13. Apache Solr入门教程(转)
  14. jquery全选的选中和取消选中
  15. Angular中$watch实现控件改变后实时发送HTTP请求
  16. maven启动tomcat访问报404(url中没有项目名)
  17. 最近在搞gitlab发现2个不错的开发流程分享一下
  18. html总结2
  19. 阿里云centos5升级yum源为6
  20. 第37章:MongoDB-集群--Replica Sets(副本集)---单机的搭建

热门文章

  1. reactor & proactor 笔记
  2. sublime 3 快捷键
  3. Redis教程(十三):管线详解
  4. Atitit cnchar simp best list  汉字简化方案 最简化汉字256个
  5. SlickUpload Quick Start Guide
  6. MVC及WebAPI添加Jsonp支持
  7. 使用模板技术处理ASP.NET中GridView额外序号列的问题
  8. struts2DMI(动态方法调用)
  9. 如何下载android官网Lib包
  10. Uvaoj 10048 - Audiophobia(Floyd算法变形)