1
我想將IL代碼注入到調用Generic方法(使用返回類型和參數)的方法中。用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)
我要處理的一般參數和返回值的類型肯定,但我不知道,我應該怎麼辦它。
你可以請一個小例子,顯示如何注入非泛型方法?如果我看到你如何嘗試,我可能會幫助你。 –
添加了非通用方法示例。 –