调用返回object
的函数后,我尝试将值存储在堆栈上的局部变量中,然后将其推回去,但它失败了,出现异常
异常被抛出,目标是调用
代码如下:
.....
MethodInfo checked_static = typeof(NameSpace1.Class1).GetMethod(
"Check", new Type[1] { typeof(object) });
adderIL.Emit(OpCodes.Callvirt, checked_static);
adderIL.Emit(OpCodes.Stloc_3);
adderIL.Emit(OpCodes.Ldloc_3);
adderIL.Emit(OpCodes.Brfalse, TRUE);
.....
如果我删除Stloc_3
和Ldloc_3
一切工作正常,我在这里迷路了。
根据你对我问题的回答,看来你还没有声明你的本地。IL中的每个方法都指示它使用的所有局部变量的类型,因此需要在adderIL
实例上使用DeclareLocal
重载之一来声明它。如果你还没有声明任何其他局部变量,那么你还需要使用OpCodes.Stloc_0
而不是OpCodes.Stloc_3
(对于负载也是如此);或者,您可以使用OpCodes.Stloc
或OpCodes.Stloc_S
,并将LocalBuilder
实例从DeclareLocal
调用作为第二个参数传递给adderIL.Emit
(在这种情况下,反射)。Emit库将为您从本地获取正确的索引)。