4

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 プロファイラーを作成しています)、そのバイトに何を入れるかを知る必要があるため、この質問をしています。

4

1 に答える 1

1

あなたの失望は正しいと思います。これは、名前付きパラメーターを使用した以前の経験から覚えています。これはNumNamed、仕様に記載されている int16 ではなく、圧縮された int として実装され、§VI.B.3 の例とは異なります。これが後続の .NET 3.0 以降の実装で変更されたかどうかはわかりません。

探しているPermissionSetについては、

... * カスタム属性への名前付き引数としてエンコードされたプロパティのセット (§II.23.3 のように、NumNamed で始まる)。

... §II.23.3 ...

次に、オプションの「名前付き」フィールドとプロパティについて説明します。これは NumNamed で始まります。これは、後続の「名前付き」プロパティまたはフィールドの数を示す符号なし int16 です。... NumNamed がゼロでない場合、NamedArgs の NumNamed の繰り返しが続きます。

これ12 01は、「続くプロパティの数を与える」リトルエンディアン整数です。1 つの名前付きプロパティ、および全長 18 (10 進数を含む)。

この合計の長さはあなたが探していたパターンですが、この長さはオプションであり、コンパイラが前の int16 にプロパティの数をパックして長さを破棄することがあるので注意してください。すべてのケースを正しく解析していることを確認するには、さまざまな数の属性を試してみる必要があります。

NamesArgs:

... SerString – PackedLen のバイト数と、それに続く UTF8 文字

PROPERTY は 1 バイトの 0x54 です。FieldOrPropName はフィールドまたはプロパティの名前で、SerString (上で定義) として格納されます。

于 2014-01-04T08:26:00.030 に答える