使用Mono.Cecil注入方法?

时间:2016-11-29 03:25:24

标签: 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.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混淆了。有人可以帮帮我吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

另外,请检查injectMethod是否为有效的方法参考。

现在,要注入方法,这应该有效:

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

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