我目前正在开发一种语言(外部字节码)的编译器,并且正在使用System.Reflection.Emit
。
现在,当我在反射器中打开生成的程序集时,一切看起来都很好,并且也可以很好地重新编译为C#(并运行),但是当我尝试运行生成的主函数时,我得到了InvalidProgramException
:
可能仅是导致该问题的单个操作码,但是,由于该主要功能使用了100多个操作码,因此我无法确定是哪个操作码导致了此问题。
每个操作码都非常复杂,因此手动测试每个操作码是不可行的。
有没有办法让.NET告诉我它在功能中的哪个位置检测到无效程序?
如果没有,我是否可以使用其他工具来确定问题的根源?
最佳答案
我最好将此作为答案。您可以使用PEVerify tool进行程序集验证。它是Windows SDK工具的一部分,最好的运行方式是从Visual Studio命令提示符peverify.exe命令开始。您将需要使用/il命令行选项来运行它来检查生成的IL,使用/md来检查程序集元数据。
通过此工具,您将获得更好的诊断,抖动产生的运行时异常信息不足以精确指出确切的错误。我不能保证它执行与抖动完全相同的检查,这些检查是截然不同的代码块,并且抖动在静态分析方面有些优势。但是,该工具是专门为您的用例(编写IL生成器的人员)设计的。我只引用MSDN文章中的 promise :
事实证明,它很适合您,这很酷:)