2017-03-16 14 views
0

ターゲットプログラムのILをメソッドの入口と出口点に変更できるプログラムを作成しています。 私が使用していますMono.Cecil このプログラムでは、ターゲットメソッドの先頭と最後にログステートメントを挿入します。Mono.Cecil:ログメソッドの入口と出口点

サンプルとして基本的なプログラムを試しました。

public class Target 
{ 
    // My target method. 
    public void Run() 
    { 
     Console.WriteLine("Run method body"); 
    } 

    // This is my log method, which i want to call in begining of Run() method. 
    public void LogEntry() 
    { 
     System.Console.WriteLine("******Entered in RUN method.***********"); 
    } 
} 

ソースプログラム。

public class Sample 
{ 
    private readonly string _targetFileName; 
    private readonly ModuleDefinition _module; 

    public ModuleDefinition TargetModule { get { return _module; } } 

    public Sample(string targetFileName) 
    { 
     _targetFileName = targetFileName; 

     // Read the module with default parameters 
     _module = ModuleDefinition.ReadModule(_targetFileName); 
    } 

    public void Run() 
    { 

     // Retrive the target class. 
     var targetType = _module.Types.Single(t => t.Name == "Target"); 

     // Retrieve the target method. 
     var runMethod = targetType.Methods.Single(m => m.Name == "Run"); 

     // Get a ILProcessor for the Run method 
     var processor = runMethod.Body.GetILProcessor(); 

     // get log entry method ref to create instruction 
     var logEntryMethodReference = targetType.Methods.Single(m => m.Name == "LogEntry"); 

     var newInstruction = processor.Create(OpCodes.Call, logEntryMethodReference); 

     var firstInstruction = runMethod.Body.Instructions[0]; 

     processor.InsertBefore(firstInstruction, newInstruction); 

     // Write the module with default parameters 
     _module.Write(_targetFileName); 
    } 
} 

私は、エラーメッセージ、次の取得しています対象プログラムのIL、 を変更するには、私のソースプログラムを実行します。

System.InvalidProgramException:Common Language Runtimeが無効なプログラムを検出しました。 at CecilDemoTarget.Target.Run() at CecilDemoTarget.Program.Main(String [] args)

答えて

0

私は、thisを指定せずにインスタンスメソッドを呼び出していると考えています。この問題を解決するには

、次の2つの選択肢があります。

  • LogEntrystaticしてください。
  • ldarg.0命令をcallの前に追加して、評価スタックにロードthisをロードします。

私が言っていることが正しいことを確認し、今後同様の問題を診断するには、修正されたアセンブリでPeverifyを実行できます。

+0

完了。ありがとう@svick – Krishnan

関連する問題