internal static void ILSpyMtNoRt(ClassDef classDef, MethodDef methodDef, Method startLogMethod, Method endLogMethod) { string classNameString = MethodLoggerUtil.GetQualifiedClassName(classDef); string methodNameString = methodDef.Name(); string paramsString = MethodLoggerUtil.GetParamsAsString(methodDef.GetParams()); List <Local> CLRLocals = new List <Local>(); CLRLocals.Clear(); Param[] parms = methodDef.GetParams(); if (methodDef.GetMaxStack() < 3) { methodDef.SetMaxStack(3); } string strGuid = Guid.NewGuid().ToString(); CILInstructions instructions = methodDef.GetCodeBuffer(); if (instructions == null) { return; } instructions.StartInsert(); instructions.Inst(Op.nop); instructions.StartBlock(); // Try #1 instructions.StartBlock(); // Try #2 instructions.Inst(Op.nop); instructions.ldstr(strGuid); instructions.ldstr(classNameString); instructions.ldstr(methodNameString); instructions.ldstr(paramsString); instructions.MethInst(MethodOp.call, startLogMethod); instructions.EndInsert(); while (instructions.GetNextInstruction().GetPos() < instructions.NumInstructions() - 2) { ; } instructions.StartInsert(); instructions.Inst(Op.nop); CILLabel cel0 = instructions.NewLabel(); CILLabel cel9 = instructions.NewLabel(); instructions.Branch(BranchOp.leave_s, cel9); TryBlock tBlk2 = instructions.EndTryBlock(); // #2 instructions.StartBlock(); int istloc = 0; if (methodDef.GetLocals() != null) { istloc = methodDef.GetLocals().Length; } instructions.IntInst(IntOp.stloc_s, istloc); instructions.Inst(Op.nop); //instructions.Inst(Op.rethrow); CILLabel cel = instructions.NewLabel(); instructions.CodeLabel(cel0); instructions.OpenScope(); //start---add exceptiong to stocks variables Local loc = new Local("SpyMtNoRt", Runtime.SystemExceptionRef); if (methodDef.GetLocals() != null) { foreach (Local lab in methodDef.GetLocals()) { CLRLocals.Add(lab); } } CLRLocals.Add(loc); methodDef.AddLocals(CLRLocals.ToArray(), false); foreach (Local la in methodDef.GetLocals()) { instructions.BindLocal(la); } //start---add exceptiong to stocks variables instructions.CloseScope(); instructions.IntInst(IntOp.ldloc_s, istloc); Method LogException = null; MethodLoggerUtil.GetMethodsFromClass("LogException", out LogException); instructions.MethInst(MethodOp.call, LogException); instructions.Inst(Op.nop); instructions.Inst(Op.nop); instructions.Branch(BranchOp.leave_s, cel9); instructions.EndCatchBlock(Runtime.SystemExceptionRef, tBlk2); instructions.CodeLabel(cel9); instructions.Branch(BranchOp.leave_s, cel); TryBlock tBlk1 = instructions.EndTryBlock(); // #1 instructions.StartBlock(); // Finally instructions.Inst(Op.nop); instructions.ldstr(strGuid); instructions.ldstr(classNameString); instructions.ldstr(methodNameString); instructions.ldstr(paramsString); instructions.MethInst(MethodOp.call, endLogMethod); instructions.Inst(Op.nop); instructions.Inst(Op.nop); instructions.Inst(Op.endfinally); instructions.EndFinallyBlock(tBlk1); instructions.CodeLabel(cel); instructions.EndInsert(); }