我正在使用Mono.Cecil
修改程序集,我想检查它的有效性(结果是否会运行)。我正在尝试使用PEVerify
,但我遇到了问题。
它是为确保代码可验证而设计的,所以它只是说ERROR
错误是否意味着IL完全无效且不会执行,或者它是否是完全信任中可忽略的可验证性问题。以下是一些例子:
.locals init
。.ctor
。导致IL无法运行的问题包括:
有没有办法让它给我一些问题严重性的指示?如果没有,是否有其他工具可以做到这一点?
答案 0 :(得分:1)
@HansPassant已经试图解释它,但只是为了让我们彼此了解,这是正在发生的事情。
PEVerify检查你的程序集中不正常的构造。也就是说,PEVerify不是JIT编译器。 JIT编译器本身不检查IL程序集 - 它只是抓取它要调用的方法,将其更改为SSA表单,优化它,编译它然后调用生成的二进制程序集。
现在,编译器将随着时间的推移而发展。优化被更改和添加,编译器的角色不一定是检查错误(如果它发现一个作为副产品,它可能会报告它,但没有保证)。请记住,JIT编译器只针对一件事情进行了无情的优化,那就是生成相当好的汇编字节代码(因为它是一种JIT语言,编译内容所需的时间非常重要)。所以,有两种不同的工具。
这基本上导致以下结果:
如果忽略PEVerify的错误,这基本上意味着结果将是未定义的行为 - 可以是从工作可执行文件到硬崩溃的任何内容。没有“警告”这样的东西。