【问题标题】:A simple Pop and then load back does not work一个简单的 Pop 然后重新加载不起作用
【发布时间】:2011-08-08 09:55:44
【问题描述】:

调用返回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_3Ldloc_3 一切正常,我就迷路了。

【问题讨论】:

  • 记录异常的 InnerException。
  • errr,我们必须声明局部变量? Ldloc_3 不会将值上传到函数中每个堆栈中存在的局部变量数组吗?

标签: .net il ilgenerator


【解决方案1】:

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

【讨论】:

  • 啊,我明白了,但是我们什么时候可以使用 Stloc_3,因为它与 Stloc_0 相同但索引不同?
  • @KiNGPiN - 如果您有 4 个本地人,那么您可以使用 Stloc_3 访问第四个本地人;如果你只有一个本地人,那么你只需使用Stloc_0
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2021-03-04
  • 2018-08-19
相关资源
最近更新 更多