1

当我对我的 .NET exe 运行 peverify 实用程序时,我收到一些错误(类、重命名的方法):

[IL]: Error: [myapp.exe : namespace.class::method1][offset 0x00000027]
Instruction cannot be verified.

[IL]: Error: [myapp.exe : namespace.class::method2][offset 0x00000027]
Instruction cannot be verified.

[IL]: Error: [myapp.exe : namespace.class::method3][offset 0x00000313]
Instruction cannot be verified.

这是我应该关心的事情吗?这些方法都使用 unsafe 关键字,我假设这是导致此错误的原因。但是我在网上找不到任何关于这个错误的文档,所以任何想法都会非常感激。谢谢!

4

2 回答 2

3

好吧,这不是因为您使用了unsafe关键字。这是因为您编写了编译的代码,因为您使用了 unsafe。是的,peverify 会拒绝这样的代码。这是不安全的本质。你不能在这里吃你的蛋糕。

于 2010-07-07T17:10:15.913 回答
1

stackalloc在那些方法中使用过吗?当我在玩这个时,我发现如果stackalloc是第一次出现无法验证的代码,那么 peverify 会吐出该错误消息并忽略该方法的其余部分。然而,事实并非如此。如果stackalloc稍后出现在方法中,则其他错误将在stackalloc语句生成的错误之前。也许那是错误?

考虑以下示例。

public static void Main()
{
  unsafe
  {
    int* a = stackalloc int[100];
    int* b = null;
  }
}

我得到以下结果:

[IL]: Error: [myassembly.exe : A.Program::Main][offset 0x00000007] Instruction cannot be verified. 
1 Error(s) Verifying myassembly.exe

但是,如果我注释掉该stackalloc行,那么我会得到以下结果:

[IL]: Error: [myassembly.exe : A.Program::Main][offset0x00000004][found Native Int][expected unmanaged pointer] Unexpected type on the stack. 
1 Error(s) Verifying myassembly.exe
于 2010-07-07T19:26:40.920 回答