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 : 공용 언어 런타임에서 잘못된 프로그램을 감지했습니다. at CecilDemoTarget.Target.Run() at CecilDemoTarget.Program.Main (String [] args).
완료. 고마워요 @ 스빅 – Krishnan