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