2017-08-30 2 views
1

Ich möchte IL-Code in Methoden injizieren, die eine generische Methode (mit Rückgabetyp und Argumente) aufruft.Aufruf generische Methode mit Mono Cecil

Ich kann nicht generische Methoden aufrufen, aber ich habe keine Ahnung, wie man eine generische Methode nennt.

Meine Frage ist, wie könnte ich diesen generischen Methodenaufruf in eine Methode injizieren?

Beispiel für nicht-generisches Verfahren Injektion:

1, wobei die Anordnung offen und die nichtgenerische Methode info

 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, Injizieren Sie die "Writeline" -Methode in die gewählten Methode erhalten:

   ILProcessor ilProcessor = method.Body.GetILProcessor(); 

       Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine); 

       ilProcessor.InsertBefore(ins, "CALL"); 
       ilProcessor.InsertBefore(ins, callWriteLine); 

die folgenden Zusatz IL Anweisungen in der gewählten Methode führt:

IL_0001: ldstr  "CALL" 
IL_0006: call   void [mscorlib]System.Console::WriteLine(string) 

Aber im Fall eines allgemeinen Verfahrens, soll ich die IL erhalten:

IL_0001: ldc.i4.s  10 // 0x0a 
IL_0003: ldstr  "CALL" 
IL_0008: call   !!0/*int32*/ ReturnTestModule.ReturnTest::MyGenericMethod<int32>(!!0/*int32*/, string) 

Ich habe die allgemeinen Argumente und den Rückgabewert Typen auf jeden Fall zu handhaben, aber ich weiß nicht, wie soll ich tun es.

+0

Können Sie bitte ein kleines Beispiel schreiben, das zeigt, wie Sie nicht-generische Methoden injizieren können? Ich könnte Ihnen vielleicht helfen, wenn ich sehe, wie Sie es versuchen. –

+0

Beispiel einer nicht generischen Methode hinzugefügt. –

Antwort

2

Ich denke, Sie sind im Grunde auf dem richtigen Weg. Alles, was Sie tun müssen, ist einen Verweis auf die generische Methode zu erhalten, so wie Sie es für die nicht-generische Version getan haben. Der Unterschied besteht darin, dass Sie für eine generische Methode die MethodInfo der offenen generischen Methode erhalten und sie zuerst schließen müssen, indem Sie die Methode MakeGeneric() verwenden und die Typen übergeben, die die Methode als generische Typargumente haben soll.

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

Und dann gehen Sie mit den MethodReference bekommen, die ILProcessor Erstellen und den Befehl Einfügen.

Verwandte Themen