简单的 Pop 然后加载回来不起作用

发布于 2024-11-28 16:44:22 字数 484 浏览 1 评论 0原文

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

调用目标已引发异常

代码如下:

.....

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_3Ldloc_3 一切正常,我会迷失在这里。

After calling a function, which returns an object, I try to store the value on stack in a local variable and then push it back, but it fails with an exception

Exception has been thrown with a target of invocation

Code is as follows:

.....

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);

.....

If I remove Stloc_3 and Ldloc_3 everything works fine, I am lost here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

戏舞 2024-12-05 16:44:22

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

Based on your response to my question, it appears that you haven't declared your local. Each method in IL indicates the types of all of the locals that it uses, so you need to declare it using one of the DeclareLocal overloads on your adderIL instance. If you haven't declared any other locals, then you'll also need to use OpCodes.Stloc_0 instead of OpCodes.Stloc_3 (and likewise for the loads); alternatively you can just use OpCodes.Stloc or OpCodes.Stloc_S and pass the LocalBuilder instance from the DeclareLocal call as the second argument to adderIL.Emit (in which case the Reflection.Emit library will get the correct index from the local for you).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文