0
Mono.Cecilを使用して、ターゲットメソッドのILコードを編集して、実際のコードを編集せずにそのメソッドのエントリポイントを記録できるようにしています。 ロギング操作を実行できるメソッドにコール命令を挿入できます。 しかし、ターゲットメソッドの入力パラメータをどのように記録するのか分かりません。 要するに、ターゲットメソッドに命令を挿入するには、ILコードを変更してログを作成するか、printメソッドを呼び出して、そのメソッドに渡された入力パラメータ値を記録します。Mono.Cecil:メソッドの先頭にlogステートメントを挿入
サンプルとして基本的なプログラムを試しました。
public class Target
{
// My target method.
public void Run(int arg0, string arg1)
{
Console.WriteLine("Run method body");
}
}
public static class Trace{
// This is my log method, which i want to call in begining of Run() method.
public void LogEntry(string methodName, object[] params)
{
System.Console.WriteLine("******Entered in "+ methodName+" method.***********")
// With params :......
//
}
}
ソースプログラム。
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(string type, string method)
{
// Retrive the target class.
var targetType = _module.Types.Single(t => t.Name == type);
// Retrieve the target method.
var runMethod = targetType.Methods.Single(m => m.Name == method);
// 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");
// Import ..
//
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);
}
}
これはinteresを鳴らし何かサンプルコードがなければ、私たちの誰も助けてくれるものはないと思っています:)あなたがこれまでに持っているものを投稿してください(敬虔ではありませんが、これは通常あなたが持つすべての質問に当てはまります今;これらのような質問のソースコードが不足していても、他の理解度の低い人々があなたに否定的な投票を与えるかもしれません)。 –
@Akos私は更新しました。 – Krishnan
これはOKですか?ここで 'targetType'は' Target'ですが、 'LogEntry'メソッドは' Trace'クラスにあります(クラスとメソッドの両方が静的でなければならないことに注意してください)。 'targetType.Methods.Single()'を実行して 'LogEntry'を探すと、' Trace'ではなく 'Target'でメソッドを探します。または私は何かを逃していますか? –