C# 使用Mono.Cecil的注入方法?

C# 使用Mono.Cecil的注入方法?,c#,cil,mono.cecil,C#,Cil,Mono.cecil,我想使用Mono.Cecil注入一个方法 我的代码如下: var worker = method.Body.GetILProcessor(); method.Body.Instructions.Clear();//Clear Old code 我想替换如下代码: return getCpu(); 所以我写: List<Instruction> listStep = new List<Instruction>(); //listStep.Add(worker.Creat

我想使用Mono.Cecil注入一个方法

我的代码如下:

var worker = method.Body.GetILProcessor();
method.Body.Instructions.Clear();//Clear Old code
我想替换如下代码:

return getCpu();
所以我写:

List<Instruction> listStep = new List<Instruction>();
//listStep.Add(worker.Create(OpCodes.Nop));
//listStep.Add(worker.Create(OpCodes.Ldarg_0));
listStep.Add(worker.Create(OpCodes.Call,injectMethod));
//listStep.Add(worker.Create(OpCodes.Stloc_0));
//listStep.Add(worker.Create(OpCodes.Ldloc_0));
//listStep.Add(worker.Create(OpCodes.Br_S));
//listStep.Add(worker.Create(OpCodes.Stloc_1));
//listStep.Add(worker.Create(OpCodes.Ldloc_1));
listStep.Add(worker.Create(OpCodes.Ret));

foreach (var item in listStep)
{
    worker.Append(item);
}
List listStep=new List();
//添加(worker.Create(opcode.Nop));
//添加(worker.Create(opcode.Ldarg_0));
Add(worker.Create(opcode.Call,injectMethod));
//添加(worker.Create(opcode.Stloc_0));
//添加(worker.Create(opcode.Ldloc_0));
//添加(worker.Create(opcode.Br_S));
//添加(worker.Create(opcode.Stloc_1));
//添加(worker.Create(opcode.Ldloc_1));
添加(worker.Create(opcode.Ret));
foreach(listStep中的变量项)
{
工人。追加(项目);
}
但它不起作用


我和伊尔混淆了。有人能帮我吗?非常感谢。

这取决于原始方法,但您可能需要添加:

method.Body.Variables.Clear();
method.Body.ExceptionHandlers.Clear();
另外,检查
injectMethod
是否是有效的方法引用

现在,要注入该方法,应该可以:

worker.Emit(Opcodes.Call, injectMethod);
worker.Emit(Opcodes.Ret);

注意,您发出的是
call
而不是
callvirt
,这是故意的吗?因为如果
injectMethod
不是一个静态方法,那么您需要发出
callvirt

它到底是如何工作的?它有什么作用?您是否已尝试在修改的程序集上运行peverify?