SecurityPermission(SecurityAction.Assert)
クラスのメソッドに次の属性があります。これをコンパイル (デバッグ ビルド) し、ildasm.exe の出力を表示します。生のヒープを表示し、PermissionSet BLOB を含む BLOB ヒープを調べます。私が期待するのは(ECMA-335による)次のとおりです。
2e 01 80 84 53 79 73 74 65 6d 2e 53 65 63 75 72 >. System.Secur<
69 74 79 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e >ity.Permissions.<
53 65 63 75 72 69 74 79 50 65 72 6d 69 73 73 69 >SecurityPermissi<
6f 6e 41 74 74 72 69 62 75 74 65 2c 20 6d 73 63 >onAttribute, msc<
6f 72 6c 69 62 2c 20 56 65 72 73 69 6f 6e 3d 32 >orlib, Version=2<
2e 30 2e 30 2e 30 2c 20 43 75 6c 74 75 72 65 3d >.0.0.0, Culture=<
6e 65 75 74 72 61 6c 2c 20 50 75 62 6c 69 63 4b >neutral, PublicK<
65 79 54 6f 6b 65 6e 3d 62 37 37 61 35 63 35 36 >eyToken=b77a5c56<
31 39 33 34 65 30 38 39 00 00
しかし、私が見たのはこれでした:
2e 01 80 84 53 79 73 74 65 6d 2e 53 65 63 75 72 >. System.Secur<
69 74 79 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e >ity.Permissions.<
53 65 63 75 72 69 74 79 50 65 72 6d 69 73 73 69 >SecurityPermissi<
6f 6e 41 74 74 72 69 62 75 74 65 2c 20 6d 73 63 >onAttribute, msc<
6f 72 6c 69 62 2c 20 56 65 72 73 69 6f 6e 3d 32 >orlib, Version=2<
2e 30 2e 30 2e 30 2c 20 43 75 6c 74 75 72 65 3d >.0.0.0, Culture=<
6e 65 75 74 72 61 6c 2c 20 50 75 62 6c 69 63 4b >neutral, PublicK<
65 79 54 6f 6b 65 6e 3d 62 37 37 61 35 63 35 36 >eyToken=b77a5c56<
31 39 33 34 65 30 38 39 01 00
01 00
特に、私が期待していた最後の に注意してください00 00
。仕様では、カウントされた文字列の後に名前付き引数の数を指定する必要があります。名前付き引数を渡さないので、その数値は 16 ビットの 0 であると予想しました。
これは、Visual Studio 2013 を使用して .NET 2.0 に対してコンパイルされます。
さらに複雑なことに、名前付き引数を追加すると、次のようになります。
2e 01 80 84 53 79 73 74 65 6d 2e 53 65 63 75 72 >. System.Secur<
69 74 79 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e >ity.Permissions.<
53 65 63 75 72 69 74 79 50 65 72 6d 69 73 73 69 >SecurityPermissi<
6f 6e 41 74 74 72 69 62 75 74 65 2c 20 6d 73 63 >onAttribute, msc<
6f 72 6c 69 62 2c 20 56 65 72 73 69 6f 6e 3d 32 >orlib, Version=2<
2e 30 2e 30 2e 30 2c 20 43 75 6c 74 75 72 65 3d >.0.0.0, Culture=<
6e 65 75 74 72 61 6c 2c 20 50 75 62 6c 69 63 4b >neutral, PublicK<
65 79 54 6f 6b 65 6e 3d 62 37 37 61 35 63 35 36 >eyToken=b77a5c56<
31 39 33 34 65 30 38 39 12 01 54 02 0d 55 6e 6d >1934e089 T Unm<
61 6e 61 67 65 64 43 6f 64 65 01 >anagedCode <
もう一度、属性のカウントされた文字列の最後を見ると12 01
、名前付き引数リスト (1 つの項目のリスト) が続いていることがわかります。01 00
これは、名前付き引数の数が 16 ビットのリトルエンディアン 1 であると予想していました。
これに基づいて、カウントされた文字列の後の 2 番目のバイトが名前付きパラメーターのカウントであると想定していますが、最初のバイトが何であるかはまだわかりません (最初の例では 0x01、次の例では 0x12)。
2 番目の名前付き属性を追加すると、最初のバイトが 26 に変更され、3 番目の名前付き属性を追加すると、33 に変更されます。数字が増加しているという事実以外に、数字の明らかなパターンは見当たりません。
手動で PermissionSet blob を作成しようとしており (CLR プロファイラーを作成しています)、そのバイトに何を入れるかを知る必要があるため、この質問をしています。