【问题标题】:Question about peverify errors关于 peverify 错误的问题
【发布时间】:2010-07-07 15:41:05
【问题描述】:

当我对我的 .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 关键字,我假设这是导致此错误的原因。但是我在网上找不到任何关于这个错误的文档,所以任何想法都会非常感激。谢谢!

【问题讨论】:

    标签: .net peverify


    【解决方案1】:

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

    【讨论】:

    • 我认为这与此有关,但没有任何文档,我只是想确定一下。谢谢!
    【解决方案2】:

    您在这些方法中是否使用了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
    

    【讨论】:

    • 我正在使用 stackalloc,我想我可以放心地忽略这些错误。
    • @Jon:是的,我想你可能在使用stackalloc。如果您可以运行无法验证的代码,您绝对可以忽略该错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多