0

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

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

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

然后,我想添加 InvokeCall 方法。所以我对其他方法做了同样的事情,打开我想要在 ILSpy 中模仿的方法,然后基本上将所有指令和局部变量复制到一个新的 CilBody 中,这些 CilBody 添加到我正在模仿的 InvokeCall 方法中。唯一的问题是它抛出了一个错误,说"Error Calculating Max Stack Value"。奇怪的是,如果我将 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")))

那也没有用。

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

4

1 回答 1

3

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

于 2014-08-17T15:25:18.907 回答