我正在使用第三方程序集,不幸吞下它的异常,因此我决定使用Mono.Cecil重写程序集(幸运的是它没有强类型)(在DI和AOP中进行了一些研究后发现了这个宝石)。 我试图找到尽可能多的信息,但我仍然对IL的组成有一些疑问。
我已经阅读了this和this,所以我知道我需要做什么,但就像我说我不知道如何生成正确的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
,然后对该变量执行stloc
和ldloc
操作? nop
和pop
命令怎么样?我需要担心the issue raised in this question吗?
非常感谢任何有关如何以正确方式执行此操作的指导!
请注意我查看了meanings命令,所以我的问题不在于它们的含义。