[英]IL Return in C# returns wrong value
我開始重寫我的函數繪圖儀,它接受數學函數並計算給定x的ay值。 要重新編寫它,我想使用IL動態創建一個方法。 我現在使用的測試IL代碼使用2個LocalBuilders並將它們相乘。 但是,當我返回值時,我會收到(似乎是)一個隨機數而不是真正的答案。
這是我一直在使用的以下代碼。
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);
您似乎意外地將返回值從int
強制轉換為double
。 動態執行在這里出乎意料地容錯,似乎沒有檢查類型不匹配。
更改調用代碼以匹配內部本地的數據類型:
var hello = new DynamicMethod(
"Hello",
typeof(int),
helloArgs,
typeof(YourClassNameHere).Module
);
請注意,最后一個參數中的類型應該是您的類名,而不是參數數據類型的類名。
這里的問題是DynamicMethod的定義:
DynamicMethod hello = new DynamicMethod("Hello",
typeof(double),
helloArgs,
typeof(double).Module);
由於6 * 5返回30,這是一個int,因此在將int更改為double並返回錯誤答案時遇到了問題。 一旦我將其更改為typeof(int),返回的值為30.我不知道IL在類型上如此特別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.