3

私はいくつかのILを放出しています、ここに私のコード:

mgen.Emit(OpCodes.Ldc_I4,0);
mgen.Emit(OpCodes.Newarr, typeof(object));
mgen.Emit(OpCodes.Stloc_1); // THIS SHOULD                       


mgen.Emit(OpCodes.Ldloc_1); // MATCH THIS ONE
mgen.Emit(OpCodes.Callvirt, typeof(IInternalFactory).GetMethod("Create"));
mgen.Emit(OpCodes.Castclass, method.ReturnType);
mgen.Emit(OpCodes.Ret);

これは進行中の作業です。配列を作成し、それを使って何かをする準備をしているので、それを保存して(Stloc_1)、すぐにスタックにプッシュして戻すことにしました(Ldloc_1)。これらの命令はILが無効であると通知されますが、私が正しく理解していれば、これらの命令はスタックを変更しないままにする必要があります。これらの2つの指示がなければ、ILは完全に機能します。だから私は、その後のプッシュでポップが機能しない理由を理解することはできません。

4

1 に答える 1

5

ローカルに値を格納する前に、メソッドを使用してローカルを宣言する必要がありますILGenerator.DeclareLocal。存在しないローカルを参照すると、JITコンパイラはプログラムを無効と宣言します。

于 2012-04-27T09:07:09.570 に答える