4

私は楽しみのためにばかげた AOT .net コンパイラを作成していますが、問題が発生しました。

アセンブリをメモリにロードし (C# で記述しています)、リフレクションを左右にスパムして、必要な情報 (メソッド本体の CIL など) を取得しています。

このページには、「現在のインスタンスへの参照が必要です (ローカル引数インデックス 0 に格納されています) [...]」と書かれています。ただし、 を呼び出すとMethodInfo.GetParameters()、この引数は返されません。

生のインデックスではなく、ParameterInfo オブジェクトなどのオペコードのフィールドを解決しているLdargため、「Ldarg.0」がインスタンス メソッド内にあると非常に混乱しますGetParameters

私の主な質問:オブジェクト (パラメーター インデックス 0)ParameterInfoのオブジェクトのインスタンスを取得する方法はありthisますか、それとも生のインデックスを使用する必要がありますか? (私は本当にintインデックスを使いたくない...)

コードは素晴らしいので、ここにいくつかのコードを示します。(クラスのプログラム内に含まれています)

static void Main(string[] args)
{
    // obviously throws an IndexOutOfRangeException instead of returning the (true) argument 0
    Console.WriteLine(typeof (Program).GetMethod("Test").GetParameters()[0]);
}

public void Test()
{
}
4

1 に答える 1

2

そのための ParameterInfo は取得できません。簡単に言うと、インスタンス メソッドの場合、メソッドの宣言型の arg-0 にマップされる "this" があります。名前も型以外の興味深いプロパティもありません。他のすべてのパラメータは 1 ずつオフセットされます。静的メソッドの場合、これは当てはまりません。これは、参照による引数である値型のインスタンス メソッドではさらに興味深いものになることに注意してください。

于 2013-05-11T16:31:35.790 に答える