使用 Mono.Cecil 注入方法?
Inject method using 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 cases 你需要发出 callvirt
.
我想使用 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 cases 你需要发出 callvirt
.