PEVerify可以告诉我每个错误的严重性吗?

时间:2015-08-09 21:07:40

标签: c# .net il peverify

我正在使用Mono.Cecil修改程序集,我想检查它的有效性(结果是否会运行)。我正在尝试使用PEVerify,但我遇到了问题。

它是为确保代码可验证而设计的,所以它只是说ERROR错误是否意味着IL完全无效且不会执行,或者它是否是完全信任中可忽略的可验证性问题。以下是一些例子:

  1. 使用指针等。
  2. 当方法有本地时,不设置.locals init
  3. 从非构造函数方法调用.ctor
  4. 导致IL无法运行的问题包括:

    1. 无法从所使用的位置访问该成员。
    2. 会员不存在。
    3. 有没有办法让它给我一些问题严重性的指示?如果没有,是否有其他工具可以做到这一点?

1 个答案:

答案 0 :(得分:1)

@HansPassant已经试图解释它,但只是为了让我们彼此了解,这是正在发生的事情。

PEVerify检查你的程序集中不正常的构造。也就是说,PEVerify不是JIT编译器。 JIT编译器本身不检查IL程序集 - 它只是抓取它要调用的方法,将其更改为SSA表单,优化它,编译它然后调用生成的二进制程序集。

现在,编译器将随着时间的推移而发展。优化被更改和添加,编译器的角色不一定是检查错误(如果它发现一个作为副产品,它可能会报告它,但没有保证)。请记住,JIT编译器只针对一件事情进行了无情的优化,那就是生成相当好的汇编字节代码(因为它是一种JIT语言,编译内容所需的时间非常重要)。所以,有两种不同的工具。

这基本上导致以下结果:

  • 编译器将编译并执行它所给出的内容。
  • PEVerify将告诉您是否定义了方法/程序集的结果。

如果忽略PEVerify的错误,这基本上意味着结果将是未定义的行为 - 可以是从工作可执行文件到硬崩溃的任何内容。没有“警告”这样的东西。