ジェネリックメソッド(戻り値の型と引数を持つ)を呼び出すメソッドにILコードを注入したいと思います。Mono Cecilでジェネリックメソッドを呼び出す
public static T MyGenericMethod<T>(T genericArg, string nonGenericArg)
{
//Do something with genericArg
return genericArg;
}
私は非ジェネリックメソッドを呼び出すことができますが、ジェネリックメソッドを呼び出す方法はわかりません。
私の質問は、このジェネリックメソッド呼び出しをメソッドにどのように注入できますか?
非ジェネリックメソッドインジェクションの例:
1、アセンブリを開き、
DefaultAssemblyResolver resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(assemblyResolverPath);
AssemblyDefinition myLibrary = AssemblyDefinition.ReadAssembly(assemblyPath, new ReaderParameters() { AssemblyResolver = resolver });
MethodInfo writeLineMethod = typeof(Debug).GetMethod("WriteLine", new Type[] { typeof(string) });
MethodReference writeLine = myLibrary.MainModule.Import(writeLineMethod);
2以外の一般的な方法で情報を取得し、選びだしメソッドに「WriteLineメソッド」メソッドを注入:
ILProcessor ilProcessor = method.Body.GetILProcessor();
Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine);
ilProcessor.InsertBefore(ins, "CALL");
ilProcessor.InsertBefore(ins, callWriteLine);
これにより、選択した方法で次の余分なIL命令が発生します。
IL_0001: ldstr "CALL"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
しかし、一般的な方法の場合には、私はこのIL受ける必要があります。
IL_0001: ldc.i4.s 10 // 0x0a
IL_0003: ldstr "CALL"
IL_0008: call !!0/*int32*/ ReturnTestModule.ReturnTest::MyGenericMethod<int32>(!!0/*int32*/, string)
を私は間違いなく、一般的な引数と戻り値の型を処理する必要がありますが、私は知らない、私はどのように行う必要がありますそれ。
非ジェネリックメソッドを挿入する方法を示す少しの例を投稿できますか?私はあなたがどのように努力しているかを見れば、あなたを助けることができるかもしれません。 –
非汎用メソッドの例が追加されました。 –