IL返回C#返回错误的值

时间:2017-01-16 19:00:43

标签: c# math cil

我开始重写我的函数绘图仪,它接受数学函数并计算给定x的y值。要重新编写它,我想使用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);

2 个答案:

答案 0 :(得分:3)

您似乎意外强制将int的返回值强制转换为double。 动态执行在这里出乎意料地容错,似乎没有检查类型不匹配。

更改调用代码以匹配内部本地的数据类型:

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

请注意,最后一个参数中的类型应该是您的类名,而不是参数数据类型的类型。

答案 1 :(得分:1)

这里的问题是DynamicMethod的定义:

IHttpContextAccessor

由于6 * 5返回30,这是一个int,因此在将int更改为double并返回错误答案时遇到了问题。一旦我将其更改为typeof(int),返回的值为30.我不知道IL在类型上如此特别。