反编译动态创建的类/类型

时间:2018-01-09 07:45:20

标签: c# reflection cil reflection.emit decompiler

我正在使用emit动态创建类型。我对此很陌生,所以我想查看我创建的代码,以确保它是正确的。

是否可以查看生成的代码?什么是适当的方法?

[编辑] 标题更正

1 个答案:

答案 0 :(得分:0)

要转储动态程序集的内容,可以使用以下模式:

// create a name
AssemblyName assemblyName = new AssemblyName("MyDynamicAssembly");

// create an assembly builder which can be dumped to disk. This is essential.
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);

// define the main module
ModuleBuilder mb = ab.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");

// define your type, the visibility accessor can be whatever, in this sample it is "public"
TypeBuilder tb = mb.DefineType("Type1", TypeAttributes.Public);

// seal the type, and get it's runtime descriptor. From now on, you can use the type
Type t = tb.CreateType();

// dump the assembly in the current directory, use an overload to specify the location
ab.Save(assemblyName.Name + ".dll");

这样,您可以检查装配体。有关MSDN的更多信息。

请注意,如果您的意图是定义可以调用的方法,并且您对整个类型定义不感兴趣,则可以使用DynamicMethod类极大地简化生成过程。

DynamicMethod类负责有效地处理单个方法的生成,而没有生成动态程序集的开销(就内存而言)。