2017-01-16 45 views
4

我開始重寫函數繪圖儀,它使用數學函數並計算給定x的y值。爲了重新編寫它,我想動態地使用IL創建一個方法。我現在使用的IL代碼測試使用2個LocalBuilder並將它們相乘。但是,當我返回值時,我收到(似乎是)一個隨機數而不是真正的答案。IL在C#中返回錯誤值

下面是我一直在使用的代碼。

 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。我的代碼有什麼問題,導致函數返回錯誤的值?

在此先感謝

編輯

調用該函數的代碼如下:

 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}; object 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); 

自6 * 5返回30,這是一個int,它有改變的int的雙重問題,並返回錯誤的答案。一旦我將其更改爲typeof(int),返回的值爲30.我不知道IL對這種類型是如此特別。