4

カスタム属性でメンバーを装飾する目的で、CIL で配列リテラルを定義するための構文は何ですか?

CIL (ilasm.exe を使用してコンパイル) でいくつかの .NET コードを作成しており、カスタム属性でメソッドを装飾する必要があります。その属性のコンストラクターは、唯一のパラメーターとして整数の配列を取ります。CILでこれを行うにはどうすればよいですか?

これは、カスタム属性のコンストラクターの署名です (変更できません)。

public FooAttribute(int[] values) {
// some hidden constructor stuff
}

これは、C# で記述している場合にメソッドを装飾する方法です (ただし、できません)。


[Foo(new int[] {1, 2, 3, 4})]
public string Bar() {
  return "Some text";
}

ildasm.exe を使用してコンパイル済みの C# を確認すると (リバース エンジニアリングによって理解しようとするため)、見苦しく使用できないバイナリ リテラルが得られます。代わりに Reflector.NET を使用してみましたが、見た目はずっと良くなりましたが、ilasm.exe はキーワード「new」で構文エラーをスローするため、使用できません。

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } }
4

1 に答える 1

3

あなたの問題が何であるかを推測するのは難しいです。この属性を Program.Test() メソッドに適用すると、次のようになります。

  .method private hidebysig static void  Test() cil managed
  {
    .custom instance void ConsoleApplication1.FooAttribute::.ctor(int32[]) = ( 01 00 04 00 00 00 01 00 00 00 02 00 00 00 03 00 
                                                                               00 00 04 00 00 00 00 00 ) 
    // Code size       2 (0x2)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ret
  } // end of method Program::Test

これを ilasm.exe で実行してください。問題ありません。配列要素の値 (スニペット ウィンドウを右にスクロールして表示) が、属性コンストラクターのデータ テーブルに埋め込むために必要な形式に既に変換されていることに注意してください。BitConverter.GetBytes() は、その仕事の一部を完了することができます。Ecma ドキュメントには、そのデータの必要な形式が含まれている必要があります。

于 2010-06-11T14:33:34.820 に答える