2017-01-16 15 views
4

私は関数のプロッタを数学的関数をとり、与えられた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); 
+0

はうまく見えます...結果を取得して表示する方法(特に 'multOfAandB'はどうなるのでしょうか)は、コードのその部分ではなく、実行に問題があると思われます。乱数は初期化されていないメモリになります。 – dlatikay

+0

@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

+0

から呼び出すパブリック変数に保存していますが、残りの呼び出しコードは[this](https://msdn.microsoft.com/en-us/)と同様に構築されていると仮定できます。 /library/csx7wsz2(v=vs.110).aspx);あなたの42は決してLdarg_0'edではありません - ここでも呼び出し元/呼び出し先の問題を疑っています – dlatikay

答えて

3

戻り値がintからdoubleに誤って強制されているようです。 ここでは、動的実行は驚くほどフォールトトレラントです。型の不一致のチェックがないようです。

変更内部地元のデータ型と一致するように、呼び出し元のコード:最後の引数に型がないこと、引数のデータ型の、あなたのクラス名でなければならないこと

var hello = new DynamicMethod(
    "Hello", 
    typeof(int), 
    helloArgs, 
    typeof(YourClassNameHere).Module 
); 

は注意を。

+0

CLRはサイズの女王です。これは、変数のサイズについて、その型よりももっと気にします(あなたが仮想メソッド呼び出しをしていない限り、それでも...) – hoodaticus

1

問題はここDynamicMethodの定義だった:

DynamicMethod hello = new DynamicMethod("Hello", 
     typeof(double), 
     helloArgs, 
     typeof(double).Module); 

5 * 6以来戻って30、int型である、それは、二重にint型を変更する問題を抱えていたし、間違った答えを返しました。一度それをtypeof(int)に変更すると、返される値は30でした。私は、ILがその型に関して非常に特殊であることは知らなかった。

関連する問題