【发布时间】:2014-05-16 04:23:00
【问题描述】:
我正在使用 Mono.Cecil 在方法主体周围添加一个 try catch 块
一切进展顺利,即使我可以在 catch 块中使用捕获的异常 exception1 参数调用方法,因为似乎 exception1 值位于堆栈顶部。
但是,在调用之后,值会从堆栈中删除,如果我想以 exception1 作为参数调用其他方法,我无法弄清楚如何在调用之前访问它的 ldloc。
所以下面的代码是有效的,我只是不知道如何以捕获的异常值作为参数调用catch块中的其他方法。
var statementInTheCatchBlock = il.Create(OpCodes.Call, module.Import(typeof(AnyType).GetMethod("AnyMethod", new[] { typeof(Exception) })));
var ret = il.Create(OpCodes.Ret);
var leave = il.Create(OpCodes.Leave, ret);
il.InsertAfter(method.Body.Instructions.Last(), statementInTheCatchBlock);
il.InsertAfter(statementInTheCatchBlock, leave);
il.InsertAfter(leave, ret);
var handler = new ExceptionHandler(ExceptionHandlerType.Catch)
{
TryStart = method.Body.Instructions.First(),
TryEnd = statementInTheCatchBlock,
HandlerStart = statementInTheCatchBlock,
HandlerEnd = ret,
CatchType = module.Import(typeof(Exception)),
};
method.Body.ExceptionHandlers.Add(handler);
提前谢谢
【问题讨论】:
标签: c# mono.cecil