可以独立于它可能引用的任何其他程序集来验证.NET程序集吗?

时间:2011-11-13 09:17:18

标签: .net cil peverify

换句话说:对于要验证的.NET程序集,是否还需要读取和分析任何引用的程序集? PEVerify工具有什么作用?

1 个答案:

答案 0 :(得分:7)

  

简答:是的,PEVerify需要加载引用的程序集。

汇编格式非常独立。但是PEVerify确实需要检查引用的程序集。

通用实例化

在程序集中,当您使用泛型类型或泛型方法时,原始泛型arity不会被保留,您必须加载类型或方法的定义以正确验证实例化,这两者都适用于arity(实例化是否具有适当数量的泛型参数?)和约束(泛型参数是否满足泛型参数中指定的泛型约束?)。如果PEVerify无法找到引用的程序集,则验证将失败。

参考成员辅助功能

如果您调用方法或操纵另一个程序集中定义的字段,PEVerify将尝试加载定义该成员的程序集,以检查该成员是否具有适当的可见性。

无法验证是否找不到程序集,否则会出现“无法解析令牌”错误。


还有一些其他情况需要正确读取您必须解析对类型的引用的元数据,因此,加载其包含的程序集,但我认为PEVerify不会检查它们:

包含枚举的自定义属性实例:

例如:

[AttributeUsage(AttributeTargets.Field)]

你必须加载AttributeTargets的定义,才能知道它是由序列化自定义属性表单中超过4个字节的int32支持的。

其值以二进制形式序列化的字段:

某些编译器可能决定在程序集中以二进制形式存储常量值。如果常量的类型不是已知原语,则必须解析对此类型的引用以了解其大小。


但话说回来,我认为PEVerify不会检查这些案例。我实际上很确定它没有检查自定义属性的编码,对于第二项,我不太确定。