ターゲットプログラムの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)
完了。ありがとう@svick – Krishnan