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

Posted

技术标签:

【中文标题】反编译动态创建的类/类型【英文标题】:Decompile a class/type created dynamically 【发布时间】:2018-01-09 07:45:19 【问题描述】:

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

是否可以查看生成的代码?有什么合适的方法来解决这个问题?

[编辑] 标题已更正

【问题讨论】:

R' Emit 与 Code DOM 相比相当困难。加上后者生成代码作为第一个要求而不是事后的想法:) 使用AssemblyBuilder.Save() 方法将程序集写入磁盘是您的用例中的一个选项吗?那将是简单的方法。 如果 ILSpy 什么都没有显示,那么很有可能什么也没有。您是否对每种动态类型都调用了TypeBuilder.CreateType() 方法?您必须对每种动态类型执行此操作。 您的反编译程序集是完全空的还是只包含类型/字段/...但没有代码?请务必使用 ILSpy 中的 IL 视图,以不受反编译器在生成 c# 代码时所做的某些解释的影响。 快速猜测,保存时检查模块DLL名称是否与程序集名称匹配。 【参考方案1】:

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

// 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 类负责有效地处理单个方法的生成,而不会产生动态程序集的开销(在内存方面)。

【讨论】:

以上是关于反编译动态创建的类/类型的主要内容,如果未能解决你的问题,请参考以下文章

java动态编译

Class.forName与动态加载

java反射--动态加载

使用动态元素创建 XML 类

无法定义使用“动态”的类或成员,因为编译器需要类型“System.Runtime.CompilerServices.DynamicAttribute”

Java动态编译