質問

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

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

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

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

これは私がC#で書いていた場合、私は私の方法を飾ると思います(私はできない)方法です。


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

はコンパイルされたC#を見てIldasm.exeを使用(しようとすると、リバースエンジニアリングによって理解するために)私に醜いと使用できなくバイナリリテラルを提供します。私の代わりにReflector.NETを使用してみましたし、それははるかに良く見えるが、私はそれを使用することはできませんのでilasm.exeは「新しい」キーワードで構文エラーをスローします:

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } }
役に立ちましたか?

解決

ハードあなたの問題が何であるかを推測します。私は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の文書は、そのデータの必要な形式を持っている必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top