2017-01-16 48 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对这种类型是如此特别。