0

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

它旨在确保代码是可验证的,所以它只是说明ERROR错误是否意味着 IL 完全无效并且不会执行,或者它是否是一个可完全信任的可验证性问题。这里有些例子:

  1. 使用指针等。
  2. .locals init当方法有本地人时不设置。
  3. .ctor从非构造方法调用。

导致 IL 无法运行的问题包括:

  1. 无法从使用成员的位置访问成员。
  2. 会员不存在。

有没有办法让我知道问题的严重性?如果没有,是否有其他工具可以做到这一点?

4

1 回答 1

1

@HansPassant 已经尝试解释它,但只是为了让我们都互相理解,这就是发生的事情。

PEVerify 检查您的程序集是否存在不正常的构造。也就是说,PEVerify 不是 JIT 编译器。JIT 编译器本身并不检查 IL 程序集——它只是抓取它要调用的方法,将其更改为 SSA 形式,对其进行优化、编译,然后调用生成的二进制程序集。

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

这基本上导致以下结果:

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

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

于 2015-08-13T06:01:50.297 回答