首先需要声明一个程序集名称,
specify a new assembly name<span );
从当前应用程序域获取程序集构造器,
create assembly builder AppDomain.CurrentDomain3 .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
有几种动态程序集构造访问限制:
AssemblyBuilderAccess.Run; 表示程序集可被执行,但不能被保存。
AssemblyBuilderAccess.Save; 表示程序集可被保存,但不能被执行。
AssemblyBuilderAccess.RunAndSave; 表示程序集可被保存并能被执行。
AssemblyBuilderAccess.ReflectionOnly; 表示程序集只能用于反射上下文环境中,不能被执行。
AssemblyBuilderAccess.RunAndCollect; 表示程序集可以被卸载并且内存会被回收。
在程序集中构造动态模块,
create module builder<span );
模块即是代码的集合,一个程序集中可以有多个模块。并且理论上讲,每个模块可以使用不同的编程语言实现,例如C#/VB。
构造一个类型构造器,
create type builder for a class<span , TypeAttributes.Public);
通过类型构造器定义一个方法,获取方法构造器,获得方法构造器的IL生成器,通过编写IL代码来定义方法功能。
create method builder typeBuilder.DefineMethod(, MethodAttributes.Static,,); 7 then get the method il generator methodBuilder.GetILGenerator();10 then create the method function);il.Emit(OpCodes.Call, ) }));)); we just read something here, throw it.17 il.Emit(OpCodes.Ret);
创建类型,
then create the whole class typevar helloKittyClassType = typeBuilder.CreateType();
如果当前程序集是可运行的,则设置一个程序入口,
set entry point for this assembly<span ));
将动态生成的程序集保存成磁盘文件,
save assembly<span );
此时,通过反编译工具,将Kitty.exe反编译成代码,
System; 2 HelloKittyClass{ SayHelloMethod() {); Console.ReadLine(); }10 }
运行结果,
完整代码
System; System.Reflection; System.Reflection.Emit; 4 EmitIntroduction{ Program {[] args) { specify a new assembly name);13 create assembly builder AppDomain.CurrentDomain .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);18 create module buildervar moduleBuilder = assemblyBuilder.DefineDynamicModule();23 create type builder for a classvar typeBuilder = moduleBuilder.DefineType(, TypeAttributes.Public);28 create method builder typeBuilder.DefineMethod(, MethodAttributes.Static,,);35 then get the method il generator methodBuilder.GetILGenerator();38 then create the method function); il.Emit(OpCodes.Call, (Console).GetMethod() })); il.Emit(OpCodes.Call, )); we just read something here, throw it. il.Emit(OpCodes.Ret);48 then create the whole class type typeBuilder.CreateType();51 set entry point for this assembly assemblyBuilder.SetEntryPoint());55 save assembly);58 Console.WriteLine(); Console.ReadLine(); } }64 }