2016-11-29 15 views
0

Mono.Cecilを使用して1つのメソッドを注入したいと考えています。私は次のようなコードを交換したいMono.Cecilを使用した注入方法?

var worker = method.Body.GetILProcessor(); 
method.Body.Instructions.Clear();//Clear Old code 

私のコードは次のようである

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); 
} 

しかし、それは動作しませんでした:

return getCpu(); 

だから私は書きます。

私は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を発行する必要があるためです。

関連する問題