私は関数のプロッタを数学的関数をとり、与えられたxのy値を計算するように書き直しました。書き直すには、ILを使って動的にメソッドを作成します。私が今使っているテストILコードは、2つのLocalBuildersを使用し、それらを乗算します。しかし、私が値を返すとき、私は実際の答えの代わりに乱数を受け取ります。IL戻り値が間違った値を返します
私が使用している次のコードは次のとおりです。
ILGenerator il = hello.GetILGenerator();
LocalBuilder a = il.DeclareLocal(typeof(int));
LocalBuilder b = il.DeclareLocal(typeof(int));
LocalBuilder multOfAandB = il.DeclareLocal(typeof(int));
il.Emit(OpCodes.Ldc_I4, 5); // Store "5" ...
il.Emit(OpCodes.Stloc, a); // ... in "a".
il.Emit(OpCodes.Ldc_I4, 6); // Store "6" ...
il.Emit(OpCodes.Stloc, b); // ... in "b".
il.Emit(OpCodes.Ldloc, a);
il.Emit(OpCodes.Ldloc, b);
il.Emit(OpCodes.Mul); // Multiply them ...
il.Emit(OpCodes.Ret); // ... and return the result.
これは30を返すはずですが、現在は4.2038953929744512E-44です。関数が間違った値を返す原因となっているコードに問題がありますか?次のように関数を呼び出すコードが事前
EDIT
で
ありがとう:
object[] invokeArgs = { 42 };
object obj = func.helloMethod.Invoke(null, BindingFlags.ExactBinding, null, invokeArgs, new CultureInfo("en-us"));
と私は後でFUNCからそれを呼び出す関数を保存私のクラスで
。 helloMethodは、以下のように定義されるDynamicMethodを有する。DynamicMethod hello = new DynamicMethod("Hello",
typeof(double),
helloArgs,
typeof(double).Module);
はうまく見えます...結果を取得して表示する方法(特に 'multOfAandB'はどうなるのでしょうか)は、コードのその部分ではなく、実行に問題があると思われます。乱数は初期化されていないメモリになります。 – dlatikay
@dlatikay私のメインから呼び出す 'object [] invokeArgs = {42}; オブジェクトobj = func.helloMethod.Invoke(null、BindingFlags.ExactBinding、null、invokeArgs、new CultureInfo( "en-us")); '私の動的メソッドは、 'DynamicMethod hello = new DynamicMethod( "Hello"、 typeof(double)、 helloArgs、 typeof(double).Module)です。 'DynamicMethodを私のメイン+ – Felix
から呼び出すパブリック変数に保存していますが、残りの呼び出しコードは[this](https://msdn.microsoft.com/en-us/)と同様に構築されていると仮定できます。 /library/csx7wsz2(v=vs.110).aspx);あなたの42は決してLdarg_0'edではありません - ここでも呼び出し元/呼び出し先の問題を疑っています – dlatikay