ILGenerator.Emit动态 MSIL编程(一)之基础
首先在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编程(一)之基础的更多相关文章
- ILGenerator.Emit动态 MSIL编程(二)之基础
public sealed class ColorToArgb { /// <summary> /// 将十六进制转化为AGRB /// </summary> /// < ...
- ILGenerator.Emit动态 MSIL编程(三)之动态代理
using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; public seale ...
- C# Emit动态代理生成一个实体对象
/// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
- ubuntu下C编程,编译基础( 转)
buntu下C编程,编译基础 C 编程中相关文件后缀 .a 静态库 (archive) .c C源代码(需要编译预处理) .h C源代码头文件 .i C源代码(不需编译预处理) .o 对象文件 ...
- Emit动态代理.NetCore迁移之旅
[前言] 前面我们介绍了Aop 从静态代理到动态代理:https://www.cnblogs.com/7tiny/p/9657451.html 我们在.NetFramework平台下使用微软提供的Em ...
- 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类
秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...
- Emit动态生成代理类用于监控对象的字段修改
利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...
- Python网络编程之网络基础
Python网络编程之网络基础 目录 Python网络编程之网络基础 1. 计算机网络发展 1.1. OSI七层模型 1.2. 七层模型传输数据过程 2. TCP/IP协议栈 2.1 TCP/IP和O ...
随机推荐
- Selenium简介(二)--基于CORE/IDE的简单应用
参考 http://blog.csdn.net/iamqa/article/details/4398240 Selenium简介(一)--总体介绍 http://blog.csdn.net/iam ...
- C#正则表达式匹配字符串
正则表达式可以快速判断所给字符串是否某种指定格式.这里将一些常用的方法封装进一个字符串工具类中. public static class StringTool { /// <summary> ...
- IOS OC 多任务定时器 NSRunLoop 管理 NSTimer
下面有两种做法 1.使用日期组件 NSDateComponents 2.使用NSString 生成一个日期 // 创建一个日历对象 NSCalendar *calendar = [NSCalenda ...
- safari 日期对象新建new Date( timeStr ) 参数TimeStr格式
这是一个浏览器兼容的问题,在此总结一下,别老在这掉坑. 先坐下测试 var timeStrArray = [ '2016-10-04', '2016.10.04', '2016/10/04', '10 ...
- 关于Kean博客的学习
由于我从事设计行业,使用Autocad进行绘图是一件单调但是拥有乐趣的工作. 大约在一年前,接触到了CAD的二次开发的内容,它使我感到新奇,并且决定花时间来研究相关的知识.这时我在网上浏览到了Kean ...
- linux c网络编程之函数
1. struct protoent *protocol=getprotobyname(char *p); 功能:通过协议名获取协议类型信息 解释:p为字符串指针,指向一个协议名,如icmp,stru ...
- SQL server2008-对象资源管理器
对象资源管理器:数据库 .安全性.服务器对象.复制.管理 .SQL server代理 六部分组成
- js 九九乘法表
/** * 第一行:1x1=1 * 第二行:2x1=2 2x2=4 * 第三行:3x1=3 3x2=6 3x3=9 */ document.write('<table border=" ...
- JDBC使用事务实例
package qddx.JDBC; import java.sql.*; public class useTransaction { public static void main(String[] ...
- Android开发教程:shape和selector的结合使用
shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...