0

そのため、最近DNLIBをいじっていて、.netファイルにメソッドを追加しようとしていました. 以前にコンパイルしたファイルからメソッドを取得したので、基本的にはメソッドを模倣しようとしていました。

GetTheTypes、InvokeIt、および InvokeCall の 3 つのメソッドがあります。

InvokeCall は GetTheTypes メソッドと InvokeIt メソッドの両方を呼び出すため、最初にメソッド GetTheTypes と InvokeIt を作成する必要がありました。だから私はそれらのメソッドを追加しました、そしてそれらは完全に追加されました。コンパイルして保存したところ、リフレクター/ILSpy で問題なく表示できました。注: メソッドを追加するとき、それらが静的か非静的かを確認するチェックがあるので、それは問題ではありません。それらはすべて public メソッドでもあります。

次に、InvokeCall メソッドを追加したいと思いました。そこで、他のメソッドに対して行ったのと同じことを行い、ILSpy で模倣したいメソッドを開き、基本的にすべての命令とローカル変数を新しい 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")))

それもうまくいきませんでした。

したがって、作成したばかりのメソッドを呼び出す方法について何か提案があれば教えてください。私はこの問題を解決する方法を最後の日かそこらで見つけようとしてきましたが、うまくいきませんでした。ありがとう。

4

1 に答える 1