I've injected an empty method into a class. I'm now trying to fill it with
this simple following code:
Affliction test = new Affliction ();
if (test != null)
Console.AddMessage ("not null");
I've converted this snippet into ILCode with Reflexil and it works fine
when I inject it with Reflexil itself.
However, when I inject the same ILCodeinstructions with Cecil, I get an
error when running the program and I also can't open it in .Net Reflector.
This is the ILcode that I'm injecting:
IL_0000: newobj System.Void Affliction::.ctor()
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: ldnull
IL_0004: call System.Boolean Affliction::op_Inequality(Affliction,Affliction
)
IL_0005: brfalse.s IL_0008
IL_0006: ldstr "not null"
IL_0007: call System.Void Console:AddMessage(System.String)
IL_0008: ret
This is how I do it:
System.Reflection.ConstructorInfo constrInfo = typeof(Affliction).
GetConstructors()[0];
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Newobj, mainMod.
Import (constrInfo)));
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Stloc_0));
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Ldloc_0));
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Ldnull));
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Call, mainMod.
Import(typeof(Affliction).GetMethod ("op_Inequality"))));
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Brfalse_S,
newMethod.Body.Instructions[1])); // instruction reference will be changed
later
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Ldstr, "not null"
));
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Call, mainMod.
Import(typeof(Console).GetMethod("AddMessage", new Type[]{typeof(String
)}))));
newMethod.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
newMethod.Body.Instructions [5].Operand = newMethod.Body.Instructions [8];
The inspection of the resulting instructions shows exactly what I'm aiming
for. And yet they don't work.
Here's the error I get in the program: *InvalidProgramException: Invalid IL
code in CommandLine:TestCecil (): IL_0005: stloc.0*
And .Net Reflector throws an error saying *Index was outside the bounds of
the array.*
This makes me think that the first instruction *Newobj *for some reason
can't create an object and doesn't push the reference onto the evaluation
stack. Then, the next instruction *stloc.0* can't pop it and put it into
the list of local variables, and this throws errors. When I reference
normal methods in the same way, they are called just fine, but the
constructors produce errors. What did I miss?
--
--
--
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.