4

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

4

1 回答 1

7

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

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

通用实例化

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

引用成员可访问性

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

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


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

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

例如:

[AttributeUsage (AttributeTargets.Field)]

您必须加载 AttributeTargets 的定义才能知道它由序列化自定义属性表单中跨越 4 个字节的 int32 支持。

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

某些编译器可能决定在程序集中以二进制形式存储常量值。在常量类型不是已知原语的情况下,您必须解析对该类型的引用才能知道它的大小。


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

于 2011-11-13T09:50:48.093 回答