簡體   English   中英

IL返回C#返回錯誤的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM