3

そのため、ブロブを使用したカスタム属性がどのように機能するかを正確に理解しようとしています。バイナリ形式は非常に...奇妙に思えます。

ildasm の例

.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = 
       ( 01 00 19 57 69 6E 64 6F 77 73 50 68 6F 6E 65 2C   // ...WindowsPhone,
        56 65 72 73 69 6F 6E 3D 76 38 2E 30 01 00 54 0E   // Version=v8.0..T.
        14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61   // .FrameworkDispla
        79 4E 61 6D 65 11 57 69 6E 64 6F 77 73 20 50 68   // yName.Windows Ph
        6F 6E 65 20 38 2E 30 )                            // one 8.0

これはどのような形式ですか?これが本当の UTF-8 かどうかはわかりませんが、なぜ最初の 2 バイトが 0x01 と 0x00 なのですか? また、逆コンパイラはこれを属性として取得します。

[assembly: TargetFramework("WindowsPhone,Version=v8.0", FrameworkDisplayName = "Windows Phone 8.0")]

このすべてがどのように正確に機能しますか?

4

1 に答える 1

4

この形式は、ECMA 共通言語インフラストラクチャ標準、具体的には「CustomAttribute : 0x0C」というタイトルのセクション II.22.10 (216 ページ) に記載されています。

「これには有益なテキストのみが含まれています」セクションは次のように始まります。

すべてのバイナリ値はリトルエンディアン形式で保存されます...

ポイント 6 で次のように続けます。

  1. 次のルールは、値「blob」の全体的な構造に適用されます (§II.23.3):
  • プロローグは 0x0001 [エラー] とする

これが、 の最初のバイトが表示される理由です[ 0x01, 0x00 ]

テキストの残りの部分は、残りがどのようにレイアウトされるかを指定するために続きますが、それはすべて仕様に含まれています。

CLR でそれがどのように表現され、それが属性 BLOB のストレージにどのように影響するかを示す詳細な分析もあります。

于 2012-11-28T16:31:42.280 に答える