C#反射发出System.Reflection.Emit学习
2015-06-12 13:35
639 查看
一、System.Reflection.Emit概述
Emit,可以称为发出或者产生。与Emit相关的类基本都存在于System.Reflection.Emit命名空间下。反射,我们可以取得形如程序集包含哪些类型,类型包含哪些方法等等大量的信息,而Emit则可以在运行时动态生成代码。
二、IL代码解析
以下代码为例:
View Code
Emit,可以称为发出或者产生。与Emit相关的类基本都存在于System.Reflection.Emit命名空间下。反射,我们可以取得形如程序集包含哪些类型,类型包含哪些方法等等大量的信息,而Emit则可以在运行时动态生成代码。
二、IL代码解析
以下代码为例:
var asmName = new AssemblyName("Test"); var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( asmName, AssemblyBuilderAccess.RunAndSave); var mdlBldr = asmBuilder.DefineDynamicModule("Main", "Main.exe"); var typeBldr = mdlBldr.DefineType("Hello", TypeAttributes.Public); var methodBldr = typeBldr.DefineMethod( "SayHello", MethodAttributes.Public | MethodAttributes.Static, null,//return type null//parameter type ); var il = methodBldr.GetILGenerator();//获取il生成器 il.Emit(OpCodes.Ldstr,"Hello, World"); 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); var t = typeBldr.CreateType(); asmBuilder.SetEntryPoint(t.GetMethod("SayHello")); asmBuilder.Save("Main.exe");
View Code
相关文章推荐
- C#中GraphicsPath的Flatten方法用法实例
- C#实现图形路径变换的方法
- C#实现图形位置组合转换的方法
- C#中Shear的用法实例
- 用C#写的读写CSV文件
- C#形状原点变换的方法
- C# 在dataset内删除数据
- C#实现字体旋转的方法
- C#实现缩放字体的方法
- 友盟推送 .NET (C#) 服务端 SDK rest api 调用库
- C#使用Matrix执行缩放的方法
- C#实现将像素转换为页面单位的方法
- C# Socket模块
- C#中事件的使用
- C# 使用WinRar命令压缩和解压缩
- C#反色处理及其效率问题分析
- C#检测上传文件类型(真实检测,不通过后缀名)
- C#中的String.Format方法
- C#中一道关于ADO.NET的基础练习题
- C#设置页面单位和缩放的方法