Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的IL返回值返回错误的值_C#_Math_Cil - Fatal编程技术网

C#中的IL返回值返回错误的值

C#中的IL返回值返回错误的值,c#,math,cil,C#,Math,Cil,我开始重新编写我的函数绘图仪,它采用数学函数并计算给定x的y值。为了重写它,我想使用IL动态创建一个方法。我现在使用的测试IL代码使用2个LocalBuilder并将它们相乘。然而,当我返回值时,我会收到(似乎是)一个随机数,而不是真正的答案 下面是我一直在使用的代码 ILGenerator il = hello.GetILGenerator(); LocalBuilder a = il.DeclareLocal(typeof(int)); Lo

我开始重新编写我的函数绘图仪,它采用数学函数并计算给定x的y值。为了重写它,我想使用IL动态创建一个方法。我现在使用的测试IL代码使用2个LocalBuilder并将它们相乘。然而,当我返回值时,我会收到(似乎是)一个随机数,而不是真正的答案

下面是我一直在使用的代码

        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"));
DynamicMethod hello = new DynamicMethod("Hello",
            typeof(double),
            helloArgs,
            typeof(double).Module);
在我的类中,我存储了函数,以便以后从func.helloMethod调用它,其中有一个DynamicMethod,其定义如下:

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

您似乎意外地将返回值从
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,这是一个整数,它在将整数改为双精度时遇到问题,并返回了错误的答案。一旦我将其更改为typeof(int),返回值为30。我不知道IL对类型如此挑剔。

看起来不错。。。如何检索和显示结果(尤其是
multOfAandB
的结果),我怀疑是执行问题,而不是代码的这一部分。随机数将是未初始化的内存。@dlatikay从我的主内存调用'object[]invokeArgs={42};object obj=func.helloMethod.Invoke(null,BindingFlags.ExactBinding,null,invokeArgs,new CultureInfo(“en-us”);'其中,我的动态方法是'dynamicmethodhello=newdynamicmethod(“hello”,typeof(double),helloars,typeof(double.Module);'我将DynamicMethod保存在一个公共变量中,我从main+调用该变量。我们是否可以假设其余调用代码的构建类似于;而且你的42从来都不是Ldarg_0'ed-仍然怀疑来电者/被叫者的问题here@dlatikay我使用的代码是基于ok。。。我们必须关注调用代码。例如,
typeof(double)
是可疑的,它不应该是int吗?请将外部调用代码编辑到您的问题中,也许我或其他人能够在那里发现问题。CLR是一个尺寸皇后。它更关心变量的大小而不是它们的类型(除非您正在进行虚拟方法调用,但即使这样…)