1

を返す関数を呼び出した後、objectスタック上の値をローカル変数に格納してからプッシュバックしようとしましたが、例外で失敗しました

呼び出しのターゲットで例外がスローされました

コードは次のとおりです。

.....

MethodInfo checked_static = typeof(NameSpace1.Class1).GetMethod(
    "Check", new Type[1] { typeof(object) });
adderIL.Emit(OpCodes.Callvirt, checked_static);
adderIL.Emit(OpCodes.Stloc_3);
adderIL.Emit(OpCodes.Ldloc_3);
adderIL.Emit(OpCodes.Brfalse, TRUE);

.....

削除Stloc_3してLdloc_3すべてが正常に機能すると、ここで迷子になります。

4

1 に答える 1

1

私の質問に対するあなたの回答に基づいて、あなたはあなたの地元を宣言していないようです。DeclareLocalILの各メソッドは、使用するすべてのローカルのタイプを示しているため、インスタンスのオーバーロードの1つを使用して宣言する必要がありadderILます。他のローカルを宣言していない場合は、OpCodes.Stloc_0代わりにOpCodes.Stloc_3(そして同様にロードに対して)使用する必要があります。OpCodes.Stlocまたは、またはを使用して、呼び出しからインスタンスを2番目の引数としてOpCodes.Stloc_S渡すこともできます(この場合、Reflection.Emitライブラリはローカルから正しいインデックスを取得します)。LocalBuilderDeclareLocaladderIL.Emit

于 2011-08-10T19:42:00.993 に答える