您的位置:首页 > 编程语言 > C#

C#反射发出System.Reflection.Emit学习

2015-06-12 13:35 639 查看
一、System.Reflection.Emit概述

  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: