2016-11-29 95 views
0

我想用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

回答

0

它是依賴於原始方法,但也許你需要添加:

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

此外,檢查injectMethod是一個有效的方法引用。

現在,注入的方法,這應該工作:

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

注意,你發出call而不是callvirt,這是故意的?因爲如果injectMethod不是靜態方法,則需要發出in most casescallvirt

相關問題