2017-08-30 19 views
1

ジェネリックメソッド(戻り値の型と引数を持つ)を呼び出すメソッドに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) 

を私は間違いなく、一般的な引数と戻り値の型を処理する必要がありますが、私は知らない、私はどのように行う必要がありますそれ。

+0

非ジェネリックメソッドを挿入する方法を示す少しの例を投稿できますか?私はあなたがどのように努力しているかを見れば、あなたを助けることができるかもしれません。 –

+0

非汎用メソッドの例が追加されました。 –

答えて

2

あなたは基本的に正しいトラックにいると思います。ジェネリックでないバージョンの場合と同じように、ジェネリックメソッドへの参照を取得するだけで済みます。違いは、ジェネリックメソッドの場合、これは開いているジェネリックメソッドのMethodInfoを提供するため、まずMakeGeneric()メソッドを使用してメソッドを閉じ、メソッドにジェネリック型引数として渡すタイプを渡す必要があります。

MethodInfo openGenericMethod = typeof(Program).GetMethod("MyGenericMethod"); 
/// this will create a reference to MyGenericMethod<int>() 
MethodInfo closedGenericMethod = openGenericMethod.MakeGenericMethod(typeof(int)); 

そしてILProcessorを作成し、命令を挿入し、MethodReferenceを取得を進めます。

関連する問題