我開始重寫函數繪圖儀,它使用數學函數並計算給定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);
看起來不錯......你如何檢索並顯示結果(尤其是'multOfAandB')是怎麼回事?),我會懷疑執行問題,而不是代碼的那一部分。隨機數將是未初始化的內存。 – dlatikay
@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
中調用,我們可以假設其餘調用代碼的構建方式與[this]類似(https://msdn.microsoft.com/en-us /library/csx7wsz2(v=vs.110).aspx);而你的42從來沒有Ldarg_0'ed - 仍然懷疑這裏的調用者/被調用者的問題 – dlatikay