C# 用Mono-Cecil调用泛型方法
我想将IL代码注入方法中,这些方法调用一个泛型方法(带有返回类型和参数) 2、将“WriteLine”方法注入choosen方法:C# 用Mono-Cecil调用泛型方法,c#,.net,generics,mono,cil,C#,.net,Generics,Mono,Cil,我想将IL代码注入方法中,这些方法调用一个泛型方法(带有返回类型和参数) 2、将“WriteLine”方法注入choosen方法: ILProcessor ilProcessor = method.Body.GetILProcessor(); Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine); ilPro
ILProcessor ilProcessor = method.Body.GetILProcessor();
Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine);
ilProcessor.InsertBefore(ins, "CALL");
ilProcessor.InsertBefore(ins, callWriteLine);
IL_0001: ldstr "CALL"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
这将在choosen方法中产生以下额外的IL指令:
ILProcessor ilProcessor = method.Body.GetILProcessor();
Instruction callWriteLine = ilProcessor.Create(OpCodes.Call, writeLine);
ilProcessor.InsertBefore(ins, "CALL");
ilProcessor.InsertBefore(ins, callWriteLine);
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)
IL_0001:ldc.i4.s10//0x0a
IL_0003:ldstr“呼叫”
打电话!!0/*int32*/ReturnTestModule.ReturnTest::MyGenericMethod(!!0/*int32*/,字符串)
我必须明确地处理泛型参数和返回值类型,但我不知道该如何处理。我认为您的思路基本正确。您所要做的就是获得对泛型方法的引用,就像您对非泛型版本所做的那样。不同之处在于,对于泛型方法,这将为您提供打开泛型方法的MethodInfo,您必须首先关闭它,使用
MakeGeneric()
方法并将希望该方法具有的类型作为泛型类型参数传递
public static T MyGenericMethod<T>(T genericArg, string nonGenericArg)
{
//Do something with genericArg
return genericArg;
}
MethodInfo openGenericMethod = typeof(Program).GetMethod("MyGenericMethod");
/// this will create a reference to MyGenericMethod<int>()
MethodInfo closedGenericMethod = openGenericMethod.MakeGenericMethod(typeof(int));
MethodInfo openGenericMethod=typeof(Program).GetMethod(“MyGenericMethod”);
///这将创建对MyGenericMethod()的引用
MethodInfo closedGenericMethod=openGenericMethod.MakeGenericMethod(typeof(int));
然后继续获取
MethodReference
,创建ILProcessor
,并插入指令。您能否发布一个演示如何注入非泛型方法的小示例?如果我看到你是如何尝试的,我可能会帮助你。添加了非泛型方法示例。