尝试使用Mono.Cecil注入Elmah错误日志记录

时间:2013-01-02 16:29:24

标签: c# elmah mono.cecil

我正在使用第三方程序集,不幸吞下它的异常,因此我决定使用Mono.Cecil重写程序集(幸运的是它没有强类型)(在DI和AOP中进行了一些研究后发现了这个宝石)。 我试图找到尽可能多的信息,但我仍然对IL的组成有一些疑问。

我已经阅读了thisthis,所以我知道我需要做什么,但就像我说我不知道​​如何生成正确的IL来进行通话

我用Cecil从一个方法中提取指令,我正在做一个简单的try / catch - >登录Elmah - >让异常继续下去,这就是我需要注入的内容 这是我试图复制的问题:

catch (Exception ex)
{
   Elmah.ErrorLog.GetDefault(System.Web.HttpContext.Current)
                           .Log(new Elmah.Error(ex));

   throw;
}

这些是我使用Cecil获得的catch块指令:

IL_010d: stloc.s V_7 
IL_010f: nop 
IL_0110: call System.Web.HttpContext System.Web.HttpContext::get_Current() 
IL_0115: call Elmah.ErrorLog Elmah.ErrorLog::GetDefault(System.Web.HttpContext) 
IL_011a: ldloc.s V_7 
IL_011c: newobj System.Void Elmah.Error::.ctor(System.Exception) 
IL_0121: callvirt System.String Elmah.ErrorLog::Log(Elmah.Error) 
IL_0126: pop 
IL_0127: rethrow 
IL_0129: nop

我正在尝试使用Cecil复制这个块,这就是我有多远:

var currentHttpContextInstruction = ilProcessor.Create(OpCodes.Call, module.Import(typeof(System.Web.HttpContext).GetProperty("Current").GetGetMethod()));
var elmahGetDefaultInstruction = ilProcessor.Create(OpCodes.Call, module.Import(typeof(Elmah.ErrorLog).GetMethod("GetDefault")));
var instantiateElmahErrorInstruction = ilProcessor.Create(OpCodes.Newobj, module.Import(typeof(Elmah.Error).GetConstructor(new[] { typeof(System.Exception) })));
var elmahErrorLogInstruction = ilProcessor.Create(OpCodes.Callvirt, module.Import(typeof(Elmah.ErrorLog).GetMethod("Log")));
var rethrowInstruction = ilProcessor.Create(OpCodes.Rethrow);

我不太确定如何正确复制剩余的指令...
我是否只需创建new VariableDefinition,将其添加到method.Body.Variables,然后对该变量执行stlocldloc操作? noppop命令怎么样?我需要担心the issue raised in this question吗?

非常感谢任何有关如何以正确方式执行此操作的指导!

请注意我查看了meanings命令,所以我的问题不在于它们的含义。

0 个答案:

没有答案