.net 如何强制CLR运行验证?

.net 如何强制CLR运行验证?,.net,clr,cil,type-safety,.net,Clr,Cil,Type Safety,下面的代码通过了CLR验证(您可以尝试使用ilasm.exe组装它,并运行生成的.exe,没有任何错误--我正在使用CLR v4.0.30319测试它) 但是,如果在生成的.exe上运行PEverify.exe,它将报告: 堆栈上出现意外类型 关于我传递给Console::WriteLine(string)方法的无效对象Exception 为什么CLR不运行验证?那么,我们如何强制CLR运行它呢 .assembly extern mscorlib { .publickeytoken =

下面的代码通过了CLR验证(您可以尝试使用
ilasm.exe
组装它,并运行生成的
.exe
,没有任何错误--我正在使用CLR v4.0.30319测试它)

但是,如果在生成的
.exe
上运行
PEverify.exe
,它将报告:

堆栈上出现意外类型

关于我传递给
Console::WriteLine(string)
方法的无效对象
Exception

为什么CLR不运行验证?那么,我们如何强制CLR运行它呢

.assembly extern mscorlib
{
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
    .ver 4:0:0:0
}

.assembly TypeSafe
{
}

.class TypeSafe
{
    .method static void Start()
    {
        .entrypoint
        ldstr       "Exception instead of String"
        newobj      instance void [mscorlib]System.Exception::.ctor(string)
        call        void [mscorlib]System.Console::WriteLine(string)
        ldstr       "I'm ok"
        call        void [mscorlib]System.Console::WriteLine(string)        
        ret
    }
}

抖动中内置的验证器存在漏洞,无法捕获所有内容。您必须使用connect.microsoft.com,但他们可能会忽略它。您不希望抖动运行PEVerify,因为它会失败,例如在编译器生成的类中,并且与Hans answer一样,抖动验证器可能存在漏洞。