为什么PEVerify说CLR期望为静态大小的数组提供单维数组?

时间:2011-12-22 22:03:24

标签: .net clr cil

此代码验证失败:

.assembly extern mscorlib {}
.assembly Program {}

.method private static void Main() cil managed
{
    .entrypoint
    .maxstack 3

    .locals init ( int32[0 ... 10] a )

    ldc.i4 10
    newarr int32
    stloc.0

    ldloc.0
    ldc.i4.0
    ldc.i4.s 32
    stelem.i4

    call string [mscorlib]System.Console::ReadLine()
    pop
    ret
}

出现以下错误:

  

[IL]:错误:[C:[...] Program.exe ::: Main] [offset 0x0000000F]预期的单维数组。 1错误验证Program.exe

然而,此代码验证正常:

.assembly extern mscorlib {}
.assembly Program {}

.method private static void Main() cil managed
{
    .entrypoint
    .maxstack 3

    .locals init ( int32[] a )

    ldc.i4 10
    newarr int32
    stloc.0

    ldloc.0
    ldc.i4.0
    ldc.i4.s 32
    stelem.i4

    call string [mscorlib]System.Console::ReadLine()
    pop
    ret
}

这是一个未实现的功能,CLR或PEVerify中的错误,还是仅仅是对使用的误解?程序都执行得很好。

1 个答案:

答案 0 :(得分:3)

我的猜测 - 这只是猜测 - 这与矢量和数组之间的区别有关。

ECMA CLI Specification(第二部分,第14.1和14.2节)说:

  

向量是具有零下限的单维数组。他们   在CIL说明中有直接支持(newarrldelemstelem,   和ldelema)。

     

[...]

     

虽然向量通过CIL指令直接支持所有其他指令   VES通过创建抽象的子类型来支持数组   班System.Array

使用T[]语法声明向量,而使用T[n]T[p,q]T[x...y]等可以通过各种方式声明数组。所以,在第一个示例中, int32[0 ... 10]语法是数组声明。在第二个示例中,int32[]语法是 vector 声明。

我的猜测是,验证程序会反对您的第一个示例,因为它认为您尝试在数组而不是上使用newarrstelem >矢量。据推测,验证者只是检查声明的类型,并没有考虑数组的等级,界限等。两个示例正确执行的原因是因为具有零下界的零的一维数组是一个向量,用于所有意图和目的。

至于为什么错误信息显示“预期的单维数组”而不是“预期的矢量”,我不知道!