1

在调用返回一个的函数后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一切正常,我就会迷失在这里。

4

1 回答 1

1

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

于 2011-08-10T19:42:00.993 回答