使用Mono.Cecil注入方法?

问题描述:

我想用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.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); 
} 

但没有奏效。

我与IL混淆。有人可以帮助我吗?非常感谢。

+0

它到底如何不起作用?它有什么作用?你是否尝试过在修改后的程序集上运行peverify? – svick

它是依赖于原始方法,但也许你需要添加:

method.Body.Variables.Clear(); 
method.Body.ExceptionHandlers.Clear(); 

此外,检查injectMethod是一个有效的方法引用。

现在,注入的方法,这应该工作:

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

注意,你发出call而不是callvirt,这是故意的?因为如果injectMethod不是静态方法,则需要发出in most casescallvirt