Hi,

very new to Emit and Cecil.
looking to insert method calls into my code.
in this example, i am trying to add calls, on each branch statement, inside 
my Demo.Do() method

getting very weird results... depends on the instructions i add probes to 
---
  NullReferenceException from IL Spy, 
  corrupt assembly when running, 
  stack size mismatch. 

if the code below the right way to inject these calls? what am i doing 
wrong?

Thanks,
Koren

*here's the code.*

// target assembly
class Demo { 
   void Do() { 
     //...  
   }
}

class Probe { 
   void Invoke(string, string, string, int, double) { //... } 
}

// in my cecil emitting assembly, 
// _module = target assembly

var staticMethod = _module.Types.First(x => 
x.Name.Equals("Probe")).Methods.First(x => x.Name.Equals("Invoke"));
var method = _module.Types.First(x => 
x.Name.Equals("Demo")).Methods.First(x=>x.Name.Equals("Do"));

// get Demo.Do() body
var il = method.Body.GetILProcessor();

// get a collection of branch instructions, i want to invoke the Probe at. 
(i.e. if (x>10) { probe(); // ... } else { probe(); //... } )
// i am getting the next nop after the branch statement to avoid splitting 
up related il lines
var instructions = method.Body.Instructions
                .Where(x => x.OpCode.FlowControl == FlowControl.Cond_Branch)
                .Where(x => x.Next != null && x.Next.OpCode.Code == 
Code.Nop)
                .Select(x => x.Next)
                .ToList();

// loop on relevant instructions, emit the call to Probe
for (int i = 0; i < instructions.Count; i++)
{                            
    var target = instructions[i];

    var block = new[] {
        il.Create(OpCodes.Ldstr, "p1"),
        il.Create(OpCodes.Ldstr, "p2"),
        il.Create(OpCodes.Ldstr, "p3"),
        il.Create(OpCodes.Ldc_I4, i),
        il.Create(OpCodes.Ldc_R8, 0),
        il.Create(OpCodes.Call, staticMethod),
        il.Create(OpCodes.Nop)
    };

    for (int b = 0; b < block.Length; b++)
    {
        il.InsertAfter(target, block[b]);
        target = block[b];
    }
}

-- 
-- 
--
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