当我对我的.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关键字,我假设这是导致此错误的原因。但是我在网上找不到任何关于这个错误的文档,所以任何想法都会非常感激。谢谢!
答案 0 :(得分:2)
嗯,这不是因为您使用了 unsafe 关键字。这是因为你编写了编译的代码,因为你使用的是不安全的。是的,peverify将不愿意这样的代码。这是不安全的本质。你不能吃蛋糕,也不能吃。
答案 1 :(得分: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