使用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混淆。有人可以帮助我吗?非常感谢。
答
它是依赖于原始方法,但也许你需要添加:
method.Body.Variables.Clear();
method.Body.ExceptionHandlers.Clear();
此外,检查injectMethod
是一个有效的方法引用。
现在,注入的方法,这应该工作:
worker.Emit(Opcodes.Call, injectMethod);
worker.Emit(Opcodes.Ret);
注意,你发出call
而不是callvirt
,这是故意的?因为如果injectMethod
不是静态方法,则需要发出in most casescallvirt
。
它到底如何不起作用?它有什么作用?你是否尝试过在修改后的程序集上运行peverify? – svick