MethodBody.Simplify() simplifies the body by turning short instructions into normal ones (e.g. leave_s to leave) After that, you can inject instructions without overflowing the offsets. Finally, you can use MethodBody.Optimize() to turn all into short form when possible.
On Mar 18, 12:13 am, "[email protected]" <[email protected]> wrote: > //A method with try ... catch (MSIL) whose Assembly is loaded by > Mono.Cecil and instructions injected in catch{ ... } block > .method private hidebysig instance void TestMethod (object A, > class [mscorlib] > System.EventArgs a) cil managed > { > // Code size 544 (0x220) > .maxstack 5 > .locals init (int32 V_0, > int32 V_1, > class [mscorlib]System.Exception V_2, > int32[] V_3, > string V_4) > .try > { > IL_0000: ldc.i4.2 > IL_0001: stloc.0 > IL_0002: ldc.i4.3 > IL_0003: stloc.1 > IL_0004: leave.s IL_001f /*** should be IL_021f ***/ > } // end .try > catch [mscorlib]System.Exception > { > IL_0006: stloc.2 > IL_0007: ldarg.0 > > // The original instruction is a "ldstr" has been replaced with a > list of instructions that I dreamed up �� > //....................... > > IL_0207: ldloc.2 > IL_0208: callvirt instance string [mscorlib] > System.Object::ToString() > IL_020d: call string [mscorlib]System.String::Concat > (string, > > string) > IL_0212: ldc.i4.0 > IL_0213: newarr [mscorlib]System.Object > IL_0218: call instance void FormBase::ShowInfo(string, > object[]) > IL_021d: leave.s IL_021f > } // end handler > IL_021f: ret > > } // end of method TestClass::TestMethod > > Instructions are injected using Mono.Cecil's method.Body.CilWorker. > As you can see from the above /* ... */ line, after the instruction > injection, the short form (_s) OpCode with > OperandType.ShortInlineBrTarget will be insufficient since it is only > 8 unsigned bit long and it will get overflow. I managed to replace the > short form OpCode with non-short form one. But that is more like a > "hack" as it replaces every single one of them. Nonetheless, that did > the trick and rendered a valid program and my small test application > succeeded. But it failed in much more complex projects. > > I wonder if I am still missing something? Thanks for any insights. --~--~---------~--~----~------------~-------~--~----~ -- mono-cecil -~----------~----~----~----~------~----~------~--~---
