C# 使用Mono.Cecil的注入方法?
我想使用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
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?