Emit语法简单实现(含实例)
来源:互联网 发布:江西淘宝大学 编辑:程序博客网 时间:2024/05/21 08:38
了解完Emit的基本概念后就应该实际动手操作一下了,就像C#代码一样Emit代码也不是都需要理解的,复杂的逻辑当然需要理解,但是像string str=”abc”;这样的就不用深究了吧,知道这是干嘛的就行了。
没有了解过Emit和IL的朋友请先看看下面两篇文章:
Emit基本概念介绍:http://blog.csdn.net/xiaouncle/article/details/52621815
轻松读懂IL:http://blog.csdn.net/xiaouncle/article/details/52770462
【无返回值】无参方法SayHello()
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, null); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈"); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //没有返回值所有加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点2】 methodInfo.Invoke(obj, null); }
.Net Reflector转换后代码:
public class Person{ // Methods public void SayHello() { Console.WriteLine("蝈蝈"); Console.ReadLine(); }}
【无返回值】静态无参方法SayHello()
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, null, null); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈"); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //没有返回值所有加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点2】 methodInfo.Invoke(obj, null); }
.Net Reflector转换后代码:
public class Person{ // Methods public static void SayHello() { Console.WriteLine("蝈蝈"); Console.ReadLine(); }}
【无返回值】含参方法SayHello(string name)
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, new Type[] { typeof(string) }); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "你好:{0}"); //【不同点2】 ilOfSayHello.Emit(OpCodes.Ldarg_1); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //没有返回值所有加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点3】 methodInfo.Invoke(obj, new object[] { "蝈蝈" }); }
.Net Reflector转换后代码:
public class Person{ // Methods public void SayHello(string text1) { Console.WriteLine("你好:{0}", text1); Console.ReadLine(); }}
【无返回值】静态含参方法SayHello(string name)
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, null, new Type[] { typeof(string) }); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "你好:{0}"); //【不同点2】 ilOfSayHello.Emit(OpCodes.Ldarg_0); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //没有返回值所有加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点3】 methodInfo.Invoke(obj, new object[] { "蝈蝈" }); }
.Net Reflector转换后代码:
public class Person{ // Methods public static void SayHello(string text1) { Console.WriteLine("你好:{0}", text1); Console.ReadLine(); }}
【有返回值】无参方法SayHello()
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, typeof(string), null); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈"); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //为什么加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); //返回值部分 LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string)); ilOfSayHello.Emit(OpCodes.Ldstr, "返回值"); ilOfSayHello.Emit(OpCodes.Stloc_0, local); ilOfSayHello.Emit(OpCodes.Ldloc_0, local); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点2】 object result = methodInfo.Invoke(obj, null); Console.WriteLine("result=" + result.ToString()); Console.ReadKey();}
.Net Reflector转换后代码:
public class Person{ // Methods public string SayHello() { Console.WriteLine("蝈蝈"); Console.ReadLine(); return "返回值"; }}
【有返回值】静态无参方法SayHello()
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, typeof(string), null); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈"); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //为什么加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); //返回值部分 LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string)); ilOfSayHello.Emit(OpCodes.Ldstr, "返回值"); ilOfSayHello.Emit(OpCodes.Stloc_0, local); ilOfSayHello.Emit(OpCodes.Ldloc_0, local); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点2】 object result = methodInfo.Invoke(obj, null); Console.WriteLine("result=" + result.ToString()); Console.ReadKey();}
.Net Reflector转换后代码:
public class Person{ // Methods public static string SayHello() { Console.WriteLine("蝈蝈"); Console.ReadLine(); return "返回值"; }}
【有返回值】含参方法SayHello(string name)
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, typeof(string), new Type[] { typeof(string) }); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈"); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //为什么加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); //返回值部分 LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string)); ilOfSayHello.Emit(OpCodes.Ldstr, "99999{0}"); //【不同点2】 ilOfSayHello.Emit(OpCodes.Ldarg_1); ilOfSayHello.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(string) })); ilOfSayHello.Emit(OpCodes.Stloc_0, local); ilOfSayHello.Emit(OpCodes.Ldloc_0, local); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点3】 object result = methodInfo.Invoke(obj, new object[] { "蝈蝈" }); Console.WriteLine("result=" + result.ToString()); Console.ReadKey();}
.Net Reflector转换后代码:
public class Person{ // Methods public string SayHello(string text1) { Console.WriteLine("蝈蝈"); Console.ReadLine(); return string.Format("99999{0}", text1); }}
【有返回值】静态含参方法SayHello(string name)
Emit代码:
static void Main(string[] args){ AssemblyName assemblyName = new AssemblyName("assemblyName"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public); //*【不同点1】 MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, typeof(string), new Type[] { typeof(string) }); ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator(); ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈"); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); //为什么加OpCodes.Pop ilOfSayHello.Emit(OpCodes.Pop); //返回值部分 LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string)); ilOfSayHello.Emit(OpCodes.Ldstr, "99999{0}"); //【不同点2】 ilOfSayHello.Emit(OpCodes.Ldarg_0); ilOfSayHello.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(string) })); ilOfSayHello.Emit(OpCodes.Stloc_0, local); ilOfSayHello.Emit(OpCodes.Ldloc_0, local); ilOfSayHello.Emit(OpCodes.Ret); Type personType = typeBuilder.CreateType(); assemblyBuilder.Save("Person.dll"); object obj = Activator.CreateInstance(personType); MethodInfo methodInfo = personType.GetMethod("SayHello"); //【不同点3】 object result = methodInfo.Invoke(obj, new object[] { "蝈蝈" }); Console.WriteLine("result=" + result.ToString()); Console.ReadKey();}
.Net Reflector转换后代码:
public class Person{ // Methods public static string SayHello(string text1) { Console.WriteLine("蝈蝈"); Console.ReadLine(); return string.Format("99999{0}", text1); }}
实例代码免费下载地址:http://download.csdn.net/detail/xiaouncle/9649675
.Net Reflector Version 9.0.1.374 带注册机免费下载地址: http://download.csdn.net/detail/xiaouncle/9649783
1 0
- Emit语法简单实现(含实例)
- Emit常用Opcodes指令使用方法(含实例)
- AngularJS $on、$emit和$broadcast简单功能实例
- AOP学习-基于Emit和Attribute的简单AOP实现
- 简单计算器实现含源码。
- 实践手记--串口通信/Windows API 实现 No.1:串口通信 API 介绍【含简单实例】
- flex 简单例子(含实例效果图 源码)
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
- Qt 多线程之间的通信 实例 emit
- Ibatis 延迟加载(懒加载)含简单实例
- android URL含进度条异步加载简单实例
- 实例详细学习PHP的简单语法
- Linux 汇编语法和简单实例
- java实现简单语法分析器
- vue之$emit和$on简单测试
- 【Cocosd2d实例教程八】Cocos2d实现碰撞检测(含实例)
- 通过Emit实现动态类生成
- 通过Emit实现动态类生成
- mybatis动态SQL
- Android:学习AIDL,这一篇文章就够了(上)
- 【web】js图片压缩并上传——图片压缩-demo01
- linux系统时间的设置
- Caffe傻瓜系列(1):数据层及参数
- Emit语法简单实现(含实例)
- java中Serializable问题
- 数据结构知识:链表,队列和栈的区别
- 给studio配置方法注释快捷键的方式:
- 关于腾讯应用管理中心,认领应用
- instancetype和id的区别
- 最新版Visual Assist X支持vc6和vs2003
- git error:index file smaller than expected
- 安卓网络图片加载框架-Picasso使用教程