换句话说:对于要验证的.NET程序集,是否还需要读取和分析任何引用的程序集? PEVerify工具有什么作用?
答案 0 :(得分:7)
简答:是的,PEVerify需要加载引用的程序集。
汇编格式非常独立。但是PEVerify确实需要检查引用的程序集。
在程序集中,当您使用泛型类型或泛型方法时,原始泛型arity不会被保留,您必须加载类型或方法的定义以正确验证实例化,这两者都适用于arity(实例化是否具有适当数量的泛型参数?)和约束(泛型参数是否满足泛型参数中指定的泛型约束?)。如果PEVerify无法找到引用的程序集,则验证将失败。
如果您调用方法或操纵另一个程序集中定义的字段,PEVerify将尝试加载定义该成员的程序集,以检查该成员是否具有适当的可见性。
无法验证是否找不到程序集,否则会出现“无法解析令牌”错误。
还有一些其他情况需要正确读取您必须解析对类型的引用的元数据,因此,加载其包含的程序集,但我认为PEVerify不会检查它们:
例如:
[AttributeUsage(AttributeTargets.Field)]
你必须加载AttributeTargets的定义,才能知道它是由序列化自定义属性表单中超过4个字节的int32支持的。
某些编译器可能决定在程序集中以二进制形式存储常量值。如果常量的类型不是已知原语,则必须解析对此类型的引用以了解其大小。
但话说回来,我认为PEVerify不会检查这些案例。我实际上很确定它没有检查自定义属性的编码,对于第二项,我不太确定。