Ich verwende Mono.Cecil, um den IL-Code meiner Zielmethode zu bearbeiten, damit ich den Einstiegspunkt dieser Methode protokollieren kann, ohne den eigentlichen Code zu bearbeiten. Ich kann eine Aufrufanweisung in eine Methode einfügen, die Protokollierung durchführen kann. Aber ich weiß nicht, wie ich die Eingabeparameter meiner Zielmethode protokollieren soll. Kurz gesagt, ich möchte eine Instruktion in die Zielmethode einfügen, indem ich ihren IL-Code ändere, um eine Protokoll- oder Sprichwort-Operation auszuführen, um die an diese Methode übergebenen Eingabeparameterwerte zu protokollieren.Mono.Cecil: Einfügen einer Protokollanweisung in Methodenanfang
Ich habe ein Basisprogramm als Beispiel versucht.
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 :......
//
}
}
Quellprogramm.
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);
}
}
Das klingt interes Ich denke nicht, dass irgendjemand von uns etwas tun kann, um zu helfen. Bitte posten Sie, was Sie bisher haben (und nicht, um pompös zu sein, aber das gilt normalerweise für jede Frage, die Sie haben werden) jetzt an; einige andere, weniger verständnisvolle Leute könnten Ihnen negative Stimmen geben, selbst wenn Sie den Quellcode für eine Frage wie diese vermissen). –
@Akos Ich habe aktualisiert. – Krishnan
Sind Sie sicher, dass dies in Ordnung ist? Ich denke, hier ist der 'targetType'' Target', aber die 'LogEntry'-Methode befindet sich in der' Trace'-Klasse (beachten Sie, dass sowohl die Klasse als auch die Methode statisch sein müssen). Wenn Sie 'targetType.Methods.Single()' ausführen und nach 'LogEntry' suchen, sucht dieser nach der Methode in 'Target', nicht in' Trace'. Oder vermisse ich etwas? –