public static void EmitTryFinally(this ILProcessor il, Action tryBlock, Action finallyBlock)
{
var end = il.Create(OpCodes.Nop);
var middle = il.Create(OpCodes.Nop);
var handler = new ExceptionHandler(ExceptionHandlerType.Finally)
{
TryStart = il.Create(OpCodes.Nop),
TryEnd = middle,
HandlerStart = middle,
HandlerEnd = end,
};
il.Append(handler.TryStart);
tryBlock();
il.Emit(OpCodes.Leave, end);
il.Append(middle);
finallyBlock();
il.Emit(OpCodes.Endfinally);
il.Append(end);
il.Body.ExceptionHandlers.Add(handler);
}