4

言い換えると、.NETアセンブリを検証するには、参照されているアセンブリのいずれかを読み取って分析する必要がありますか?PEVerifyツールは何をしますか?

4

1 に答える 1

7

簡単な答え: はい、PEVerify は参照されたアセンブリをロードする必要があります。

アセンブリ形式は自己完結型です。しかし、実際には、参照されているアセンブリで PEVerify がチェックする必要があることがいくつかあります。

汎用インスタンス化

アセンブリでは、ジェネリック型またはジェネリック メソッドを使用すると、元のジェネリック アリティが保持されず、型またはメソッドの定義を読み込んで、インスタンス化を適切に検証する必要があります。ジェネリック引数の適切な数を持っていますか?) および制約 (ジェネリック引数は、ジェネリック パラメーターで指定されたジェネリック制約を満たしていますか?) PEVerify が参照されているアセンブリを見つけられない場合、検証は失敗します。

参照メンバーのアクセシビリティ

メソッドを呼び出したり、別のアセンブリで定義されたフィールドを操作したりすると、PEVerify はメンバーを定義するアセンブリを読み込んで、メンバーが適切な可視性を持っていることを確認しようとします。

アセンブリが見つからない場合は検証に失敗し、それ以外の場合は「トークンを解決できません」というエラーが表示されます。


型への参照を解決しなければならないメタデータの一部を適切に読み取るために、それを含むアセンブリをロードする必要がある他のいくつかのケースがありますが、PEVerify がそれらをチェックするとは思いません。

列挙型を含むカスタム属性のインスタンス化:

例えば:

[AttributeUsage (AttributeTargets.Field)]

AttributeTargets の定義をロードして、シリアル化されたカスタム アトリビュート フォームで 4 バイトを超える int32 によってサポートされていることを確認する必要があります。

値がバイナリ形式でシリアル化されるフィールド:

一部のコンパイラは、定数値をバイナリ形式でアセンブリに格納することを決定する場合があります。定数の型が既知のプリミティブでない場合、この型への参照を解決してそのサイズを知る必要があります。


しかし、繰り返しになりますが、PEVerify はこれらのケースをチェックしていないと思います。私は実際には、カスタム属性のエンコーディングをチェックしていないと確信しています.2番目の項目については、よくわかりません.

于 2011-11-13T09:50:48.093 に答える