I try to add a try finally block to my methods but it does not work 
chrchrchr. Try catch works, but with try finally the unit test cannot load 
the dll because of 'Common Runtime Language detected invalid program'
What am I doing wrong, PLEASE HELP

//// Start code //////

  med.Body.SimplifyMacros();

 ILProcessor ilProcessor = med.Body.GetILProcessor();

      var firstInstruction = FindFirstInstructionSkipCtor(med);

      var fTraceVar = new VariableDefinition("FTraceVar", 
mod.Import(typeof(syngo.Common.Diagnostics.Tracing.FTrace)));
      med.Body.Variables.Add(fTraceVar);

      /////////////// Start of try block      
      Instruction loadMethodNameInstr = Instruction.Create(OpCodes.Ldstr, 
med.Name);
      ilProcessor.InsertAfter(firstInstruction, loadMethodNameInstr); 

      Instruction loadDomainInstruction = 
Instruction.Create(OpCodes.Ldsfld, fTraceDomainField);
      ilProcessor.InsertBefore(loadMethodNameInstr, loadDomainInstruction); 

      var constructor = 
        typeof(syngo.Common.Diagnostics.Tracing.FTrace).GetConstructor(
        new[]
        {
          typeof(syngo.Common.Diagnostics.Tracing.FTraceDomain), 
typeof(string)
        });
      var constructorReference = mod.Import(constructor);
      Instruction newConstructorInstruction = 
Instruction.Create(OpCodes.Newobj, constructorReference);
      ilProcessor.InsertAfter(loadMethodNameInstr, 
newConstructorInstruction); // create new instance of person

      Instruction popFTraceVariableInstruction = 
Instruction.Create(OpCodes.Stloc, fTraceVar);
      //Pop a value from stack and store into local variable at index.
      ilProcessor.InsertAfter(newConstructorInstruction, 
popFTraceVariableInstruction);

  var endFinally = Instruction.Create(OpCodes.Endfinally);
      var leave = Instruction.Create(OpCodes.Leave, endFinally);



      //////// Start Finally block
      Instruction loadFTraceVarInstruction = 
Instruction.Create(OpCodes.Ldloca, fTraceVar);
      ilProcessor.InsertAfter(med.Body.Instructions.Last(), 
loadFTraceVarInstruction); //Loads local variable onto stack
      //ilProcessor.InsertBefore(lastInstruction, 
loadFTraceVarInstruction); //Loads local variable onto stack

      Instruction callDisposeInstruction = Instruction.Create(OpCodes.Call,
        
mod.Import(typeof(syngo.Common.Diagnostics.Tracing.FTrace).GetMethod("Dispose")));
      ilProcessor.InsertAfter(loadFTraceVarInstruction, 
callDisposeInstruction); // calls dispose


      ilProcessor.InsertAfter(callDisposeInstruction, leave);
      ilProcessor.InsertAfter(leave, endFinally);

   
      ///////// End finally block


 var handler = new ExceptionHandler(ExceptionHandlerType.Finally)
      {
        TryStart = med.Body.Instructions.First(),
        TryEnd = callDisposeInstruction,
        HandlerStart = callDisposeInstruction,
        HandlerEnd = endFinally,
        //CatchType = mod.Import(typeof(Exception)),
      };


      med.Body.ExceptionHandlers.Add(handler);
      med.Body.InitLocals = true;
      med.Body.OptimizeMacros();

-- 
-- 
--
mono-cecil
--- 
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to