首先在Framework中,Emit相关的类基本都存在于System.Reflection.Emit命名空间下。可见Emit是作为反射的一个元素存在的。

Emit能够实现什么?为什么要学习Emit?首先Emit是C#实现动态代理最佳的方式.动态代理技术也是AOP的思想精髓。现在一些主流的

ORM框架也集成了动态代理的设计思想。对于我们了解认识框架是完全有必要学习的。

这一节属于入门基础级别:看C#一段代码:

public int Sum()

   {
       int a = 1;
       int b = 2;
      int c = a + b;
      return c;
  }

  使用IL反汇编程序如下图查看这段代码的IL代码:

  

写出生成这个代码的动态的DLL 代码如下:

public static void SetValue()
{
  #region
  var asmName = new AssemblyName("Test");
  var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);//创建程序集
  var mdlBldr = asmBuilder.DefineDynamicModule("Test", "Test.dll");//定义模块
  var typeBldr = mdlBldr.DefineType("ILTest", TypeAttributes.Public);//定义类
  var methodBldr = typeBldr.DefineMethod("Sum", MethodAttributes.Public, typeof(int), null);//定义方法
  var il = methodBldr.GetILGenerator();//获取il生成器
  #endregion
  //IL注册变量
  il.DeclareLocal(typeof(int));
  il.DeclareLocal(typeof(int));
  var i=il.DeclareLocal(typeof(int));
  Label lbl = il.DefineLabel();
  il.Emit(OpCodes.Ldc_I4_1);
  il.Emit(OpCodes.Stloc_0);
  il.Emit(OpCodes.Ldc_I4_2);
  il.Emit(OpCodes.Stloc_1);
  il.Emit(OpCodes.Ldloc_0);
  il.Emit(OpCodes.Ldloc_1);
  il.Emit(OpCodes.Add);
  il.Emit(OpCodes.Stloc, i);
  il.Emit(OpCodes.Br_S, lbl);
  il.MarkLabel(lbl);
  il.Emit(OpCodes.Ldloc, i);
  il.Emit(OpCodes.Ret);
  typeBldr.CreateType();
  asmBuilder.Save("Test.dll");//方便反编译 看代码写的对不对
}

编译生成 DLL 如下图:

使用反编译工具打开这个DLL文件如下图:

后面将会介绍Emit注册 属性 ,变量等常用功能.希望喜欢这部分技术的人也可以多多分享一下自己的研究成果。

ILGenerator.Emit动态 MSIL编程(一)之基础的更多相关文章

  1. ILGenerator.Emit动态 MSIL编程(二)之基础

    public sealed class ColorToArgb { /// <summary> /// 将十六进制转化为AGRB /// </summary> /// < ...

  2. ILGenerator.Emit动态 MSIL编程(三)之动态代理

    using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; public seale ...

  3. C# Emit动态代理生成一个实体对象

    /// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...

  4. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  5. ubuntu下C编程,编译基础( 转)

    buntu下C编程,编译基础     C 编程中相关文件后缀 .a 静态库 (archive) .c C源代码(需要编译预处理) .h C源代码头文件 .i C源代码(不需编译预处理) .o 对象文件 ...

  6. Emit动态代理.NetCore迁移之旅

    [前言] 前面我们介绍了Aop 从静态代理到动态代理:https://www.cnblogs.com/7tiny/p/9657451.html 我们在.NetFramework平台下使用微软提供的Em ...

  7. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  8. Emit动态生成代理类用于监控对象的字段修改

    利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...

  9. Python网络编程之网络基础

    Python网络编程之网络基础 目录 Python网络编程之网络基础 1. 计算机网络发展 1.1. OSI七层模型 1.2. 七层模型传输数据过程 2. TCP/IP协议栈 2.1 TCP/IP和O ...

随机推荐

  1. C++中的private/protected/public

    访问权限: 继承关系:

  2. S2SH三大框架整合(配置及思想)

    花了一下午,终于将struts2.18+hibernate3.5.6+spring2.5.5进行整合,完成功能:在Oracle数据库的TCourse表中插入一条数据. Ⅰ,整合流程:web启动———— ...

  3. background-origin和background-clip的区别

    background-origin和background-clip是CSS3内新增加的属性,其实一个是对背景图片的放置,另一个是对背景图片的剪裁. background-origin和backgrou ...

  4. 烧写ARM开发板系统教程----->uboot 、内核以及文件系统

    一.sd启动 将u-boot镜像写入SD卡,将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是 ...

  5. 第二章 搭建Android开发环境--读书笔记

    俗话说,工欲善其事,必先利其器,对于Android驱动开发来说,首先我们要做的就是搭建Android开发环境,我们首先要配置Linux驱动的开发环境,接着还得配置开发Android应用程序以及Andr ...

  6. 前端构建工具gulp入门教程(share)

    参考自:http://segmentfault.com/a/1190000000372547 资源: npm上得gulp组件 gulp的Github主页 官方package.json文档 gulp中文 ...

  7. Surprise团队第四周项目总结

    Surprise团队第四周项目总结 项目进展 这周我们小组的项目在上周的基础上进行了补充,主要注重在注册登录界面的改进优化与美观,以及关于人计算法的学习与初步实现. 我们小组针对上次APP中界面出现的 ...

  8. 声明提前js变量

    声明提前问题相关 js的变量声明语句无论出现在何处,都会先与其他代码首先被执行,使用var声明关键词声明变量的 作用于是当前的执行上下文,有可能是外围函数,或者,当变量声明在函数体之外时,则为全局变量 ...

  9. php-长文章分页函数

    <?php function ff_page($content,$page) { global $expert_id; $PageLength = 2000; //每页字数 $CLength = ...

  10. Obiee11g变量

    原文地址:http://xee123.blog.163.com/blog/static/277119942012612104438332/ Obiee 版本 11.1.1.5 库变量 库变量在同一时刻 ...