【问题标题】:Calling A Method That Was Just Created. Error Calculating Max Stack Value调用刚刚创建的方法。计算最大堆栈值时出错
【发布时间】:2014-08-17 14:58:35
【问题描述】:

所以我最近在玩 DNLIB,我试图向 .net 文件添加方法。我从以前编译的文件中获得了方法,所以基本上,我试图模仿该方法。

有 3 种方法:GetTheTypes、InvokeIt 和 InvokeCall。

首先,我必须创建方法 GetTheTypes 和 InvokeIt,因为 InvokeCall 调用 GetTheTypes 方法和 InvokeIt 方法。所以我添加了这些方法,它们被完美地添加了。它编译并保存,我能够在反射器/ILSpy 中毫无问题地看到它们。注意:当我添加方法时,我会检查它们是静态的还是非静态的,所以这不是问题。它们也是公共方法。

然后,我想添加 InvokeCall 方法。所以我对其他方法做了同样的事情,打开我想要在 ILSpy 中模仿的方法,然后基本上将所有指令和局部变量复制到一个新的 CilBody 中,这些 CilBody 添加到我正在模仿的 InvokeCall 方法中。唯一的问题是它抛出了一个错误,提示 “计算最大堆栈值时出错”。奇怪的是,如果我将 OPCode 从 Call 更改为 NewObj,它编译得很好。但这不是我想做的。我想做的就是抛出上面提到的错误。

这是我用来添加指令的代码:

cBody.Instructions.Add(OpCodes.Call.ToInstruction(_getTheTypesMethod))

_getThetypesMethod 变量被定义为一个MethodDefUser,它包含我之前创建并编译得很好的方法。我也试过这个:

cBody.Instructions.Add(OpCodes.Call.ToInstruction(t.Asm.Import(_getTheTypesMethod)))

那也没用。我也尝试过获取方法的DeclaringType,然后找到这样的方法:

cBody.Instructions.Add(OpCodes.Call.ToInstruction(t.Asm.Import(_getTheTypesMethod.GetDeclaringType().FindMethod("GetTheTypes")))

那也没用。

所以如果有人对如何调用刚刚创建的方法有任何建议,请告诉我。我一直试图找出如何解决这个问题的最后一天左右,没有占上风。谢谢。

【问题讨论】:

    标签: c# vb.net instructions opcodes dnlib


    【解决方案1】:

    答案是我的 MethodSig 错误。我正在使用实例 MethodSig 引用静态方法。我只在为方法属性创建方法时进行了检查,而不是创建属性。

    【讨论】:

    • 感谢分享。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2022-11-22
    相关资源
    最近更新 更多