Jeff
Ok I have a suggestion
Lets say u are modifying MethodA .
1. Create a new MethodX
2. Move all the instructions of MethodA into MethodX (Method A is now empty)
3. In MethodA now place the following code
Call MethodX and assign to local varibale
Insert your custom instuctions
Return the local variable
The one problem with this is MethodX will now not be debuggable. Not
sure if this is an issue for you.
On Mon, Nov 22, 2010 at 8:47 AM, Jeff Nevins <[email protected]> wrote:
> It's a bunch of methods, both private and public.
>
> I tried using a try/finally block but then peverify complained that I
> can't return out of a finally block.
>
> The easiest thing I can think of is to make a second copy of the
> method and dump the original contents of the method in there, then
> just call that, store the result in a local, call my new instructions,
> and return the local... but that would make my original code
> completely non debuggable right?
>
> On Nov 21, 8:07 am, Simon Cropp <[email protected]> wrote:
>> Jeff
>>
>> Is it a private method ?
>>
>> On 21/11/2010, at 10:14 PM, Jb Evain <[email protected]> wrote:
>>
>>
>>
>> > You have to analyze the whole body of the method to determine its exit
>> > points and track the stack usage to be sure to not mess up with it.
>>
>> > On Sun, Nov 21, 2010 at 3:48 AM, Jeff Nevins <[email protected]> wrote:
>> >> Anyone?....please :)
>>
>> >> On Nov 18, 4:22 pm, Jeff Nevins <[email protected]> wrote:
>> >>> I guess this is more of an IL instruction but I'd appreciate any help
>> >>> all the same.
>>
>> >>> I need to add a method call at the end of an arbitrary set of methods.
>> >>> The Instructions I'm emitting are fine for most methods - I'm adding
>> >>> my new Instructions before the last found instruction with a Ret code:
>>
>> >>> var returnInstruction =
>> >>> method.Body.Instructions.LastOrDefault(i => i.OpCode.Code ==
>> >>> Code.Ret);
>>
>> >>> ....
>>
>> >>> foreach (Instruction instruction in exitInstructions)
>> >>> {
>> >>> processor.InsertBefore(returnInstruction,
>> >>> instruction);
>> >>> }
>>
>> >>> However, sometimes this approach bombs and I get an Invalid Program
>> >>> exception, which seems to happen when there is a Br_S instruction
>> >>> before the Ret instruction....which I guess makes sense.
>>
>> >>> So, my question is...how can I reliably determine where to insert my
>> >>> new instruction(s) at the end of the method, before it returns?
>>
>> >>> Thanks in advance.
>>
>> >> --
>> >> --
>> >> mono-cecil
>>
>> > --
>> > --
>> > mono-cecil
>
> --
> --
> mono-cecil
--
--
mono-cecil