.net 一个简单的弹出然后重新加载不起作用

.net 一个简单的弹出然后重新加载不起作用,.net,il,ilgenerator,.net,Il,Ilgenerator,调用一个返回对象的函数后,我尝试将堆栈上的值存储在局部变量中,然后将其推回,但失败了,出现了一个异常 已使用调用目标引发异常 代码如下: ..... MethodInfo checked_static = typeof(NameSpace1.Class1).GetMethod( "Check", new Type[1] { typeof(object) }); adderIL.Emit(OpCodes.Callvirt, checked_static); adderIL.Emit(Op

调用一个返回
对象的函数后,我尝试将堆栈上的值存储在局部变量中,然后将其推回,但失败了,出现了一个异常

已使用调用目标引发异常

代码如下:

.....

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中的每个方法都指示它使用的所有局部变量的类型,因此需要在
addril
实例上使用
DeclareLocal
重载之一声明它。如果您尚未声明任何其他局部变量,则还需要使用
操作码.Stloc_0
而不是
操作码.Stloc_3
(同样,对于负载);或者,您可以使用
操作码.Stloc
操作码.Stloc_S
并将
DeclareLocal
调用中的
LocalBuilder
实例作为
addril.Emit
的第二个参数传递给
addril.Emit>(在这种情况下,反射.Emit库将为您从本地获取正确的索引).

根据您对我的问题的回答,您似乎还没有申报您的本地身份。IL中的每个方法都指示它使用的所有局部变量的类型,因此需要在
addril
实例上使用
DeclareLocal
重载之一声明它。如果您尚未声明任何其他局部变量,则还需要使用
操作码.Stloc_0
而不是
操作码.Stloc_3
(同样,对于负载);或者,您可以使用
操作码.Stloc
操作码.Stloc_S
并将
DeclareLocal
调用中的
LocalBuilder
实例作为
addril.Emit
的第二个参数传递给
addril.Emit>(在这种情况下,反射.Emit库将为您从本地获取正确的索引).

记录异常的InnerException.errr,我们必须声明局部变量吗?Ldloc_3不是将值上传到函数中每个堆栈的局部变量数组中吗?记录异常的InnerException.errr,我们必须声明局部变量吗?Ldloc_3不是将值上传到函数中每个堆栈的局部变量数组中吗?啊,我明白了,但是什么时候我们可以使用Stloc_3,因为它与Stloc_0相同,但索引不同?@KiNGPiN-如果你有4个局部变量,那么你可以使用
Stloc_3
访问第四个局部变量;如果你只有一个局部变量,那么你只需要使用
Stloc_0
。啊,我明白了,但是什么时候我们可以使用Stloc_3,因为它与Stloc_0相同,但索引不同?@KiNGPiN-如果你有4个局部变量,那么你可以使用
Stloc_3
访问第四个局部变量;如果只有一个本地文件,那么只需使用
Stloc\u 0