【问题标题】:Open Emitted assembly generated code appears empty in Reflector when it is not.Open Emitted 程序集生成的代码在 Reflector 中显示为空,但不是。
【发布时间】:2026-02-16 12:00:02
【问题描述】:

我正在使用 Reflection.Emit 生成一个动态程序集,其中包含一个类。我有一个导致 BadImageException 的错误。为了解决这个问题,我需要查看编译后的代码,因此我将动态程序集保存到磁盘。

我已经针对似乎认为没有错误的程序集尝试了 PEVerify。我现在想在 Reflector 中查看生成的代码,但程序集显示为空(我知道它不是)。

知道为什么会这样吗?

var assemblyName = new AssemblyName("An.Assembly");
var appDomain = Thread.GetDomain();
var assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);
var typeBuilder = moduleBuilder.DefineType("MyClass", TypeAttributes.Public | TypeAttributes.Class);
... 
typeBuilder.CreateType();
assemblyBuilder.Save("temp.dll");

顺便说一句,我已经在使用 Relection.Emit 反射器插件,但这对解决这个问题没有帮助。

【问题讨论】:

  • BadImageFormatException?这很奇怪。更好地记录异常,消息 + 堆栈跟踪。
  • 用ildasm看也是空的吗?
  • 不,这是由于IL代码的发出错误导致的BadImageException。即使我恢复我的代码以使其不会引发异常,我仍然无法在 Reflector 中查看发出的代码。
  • 是的,ildasm 也是空的。不知道我错过了什么。

标签: c# reflection.emit .net-reflector


【解决方案1】:

替换:

var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);

与:

var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, "yourfilename.dll");

然后在您的当前目录中查找它,可能是您的 bin 文件夹。程序集和模块在技术上是两个独立的实体,您只保存程序集信息,而不是模块信息(所有代码所在的位置)。 (当然,不要用相同的文件名来命名它们。)

【讨论】:

  • 这没有区别,无论哪种情况,文件都会被写出。
  • @TheCodeKing,你试过了吗?无论哪种情况,文件都会被写出,但重要的是,文件内容不同
  • 对不起,我收回了,我仍在打开 temp.dll,但它实际上创建了另一个名为“an.assembly.dll”的程序集,其中包含代码!非常感谢,我花了很长时间试图弄清楚这一点。