换句话说:对于要验证的.NET程序集,是否还需要读取和分析任何引用的程序集?PEVerify工具是做什么的?
发布于 2011-11-13 17:50:48
简短回答:是的,PEVerify需要加载引用的程序集。
汇编格式是非常独立的。但是确实有一些东西是PEVerify需要在引用的程序集中检查的。
泛型实例
在程序集中,当您使用泛型类型或泛型方法时,不会保留原始泛型,您必须加载类型或方法的定义以正确地验证实例化(实例化是否具有适当数量的泛型参数?)对于约束(泛型参数是否满足泛型参数上指定的泛型约束?)。如果PEVerify找不到引用的程序集,则验证将失败。
引用的成员可访问性
如果您调用方法或操作在另一个程序集中定义的字段,PEVerify将尝试加载定义该成员的程序集,以检查该成员是否具有适当的可见性。
如果找不到程序集,它将无法验证,否则将出现“Unable to resolve token”错误。
在其他几种情况下,要正确读取元数据,您必须解析对类型的引用,从而加载其包含程序集,但我不认为PEVerify会检查它们:
包含枚举的自定义属性实例化:
例如:
AttributeUsage (AttributeTargets.Field)
您必须加载AttributeTargets的定义,才能知道它是由序列化的自定义属性表单中跨越4个字节的int32支持的。
值以二进制形式序列化的字段:
一些编译器可能决定将常量值以二进制形式存储在程序集中。在常量的类型不是已知原语的情况下,您必须解析对此类型的引用才能知道其大小。
但话又说回来,我不认为PEVerify会检查这些情况。实际上我很确定它不会检查自定义属性的编码,对于第二个项目,我不是很确定。
https://stackoverflow.com/questions/8110677
复制相似问题