That looks like a bug in Reflector to me. I can bet they expect a pattern like:

ldtoken
class GetMethodFromHandle

To turn it into a methodof.

But as I said, the code you inject has no real C# representation anyway.

On Mon, Nov 29, 2010 at 7:52 PM, Jeff Nevins <[email protected]> wrote:
> This is the IL code crashes Reflector when switching to C# (or VB.NET)
> mode. I've marked the culprit lines. If I ldnull instead of ldtoken,
> Reflector doesn't bug out anymore. It happens on all woven methods,
> not just this one. It's kind of important that this work, since
> developers may need to debug the woven code... Suggestions are much
> appreciated.
>
> Thanks.
>
> .method public hidebysig specialname rtspecialname instance
> void .ctor() cil managed
> {
>    .maxstack 4
>    .locals init (
>        [0] class
> [WorkstationWeaver]WorkstationWeaver.PreInvocationContext context)
>    L_0000: ldarg.0
>    L_0001: ldnull
>    L_0002: stfld class [System]System.ComponentModel.IContainer
> Workstation.Applications.Common.Diagnostics.SomeClassCP::components
>    L_0007: ldarg.0
>    L_0008: call instance void
> Workstation.Applications.Common.UI.Content.ContentPaneBase::.ctor()
>    L_000d: ldarg.0
>    XXXXXX L_000e: ldtoken instance void
> Workstation.Applications.Common.Diagnostics.SomeClassCP::.ctor()
>    XXXXXX L_0013: ldtoken
> Workstation.Applications.Common.Diagnostics.SomeClassCP
>    L_0018: newobj instance void
> [WorkstationWeaver]WorkstationWeaver.PreInvocationContext::.ctor(object,
> valuetype [mscorlib]System.RuntimeMethodHandle, valuetype
> [mscorlib]System.RuntimeTypeHandle)
>    L_001d: stloc.0
>    L_001e: ldloc.0
>    L_001f: ldc.i4.0
>    L_0020: call void
> [WorkstationWeaver]WorkstationWeaver.InterceptionContext::OnPreInvocation(class
> [WorkstationWeaver]WorkstationWeaver.PreInvocationContext, bool)
>    L_0025: nop
>    L_0026: nop
>    L_0027: ldarg.0
>    L_0028: call instance void
> Workstation.Applications.Common.Diagnostics.SomeClassCP::InitializeComponent()
>    L_002d: nop
>    L_002e: ldarg.0
>    L_002f: call instance void
> Workstation.Applications.Common.Diagnostics.SomeClassCP::Init()
>    L_0034: nop
>    L_0035: nop
>    L_0036: ldarg.0
>    XXXXXX L_0037: ldtoken instance void
> Workstation.Applications.Common.Diagnostics.SomeClassCP::.ctor()
>    XXXXXX L_003c: ldtoken
> Workstation.Applications.Common.Diagnostics.SomeClassCP
>    L_0041: ldloc.0
>    L_0042: callvirt instance object
> [WorkstationWeaver]WorkstationWeaver.PreInvocationContext::get_CorrelationState()
>    L_0047: newobj instance void
> [WorkstationWeaver]WorkstationWeaver.PostInvocationContext::.ctor(object,
> valuetype [mscorlib]System.RuntimeMethodHandle, valuetype
> [mscorlib]System.RuntimeTypeHandle, object)
>    L_004c: call void
> [WorkstationWeaver]WorkstationWeaver.InterceptionContext::OnPostInvocation(class
> [WorkstationWeaver]WorkstationWeaver.PostInvocationContext)
>    L_0051: ret
> }
>
> On Nov 29, 1:23 pm, Jb Evain <[email protected]> wrote:
>> On Mon, Nov 29, 2010 at 7:13 PM, Jeff Nevins <[email protected]> wrote:
>> > Works great! Peverifies fine, but for some reason when I use the code:
>>
>> > processor.InsertBefore(insertBefore, processor.Create(OpCodes.Ldtoken,
>> > method.Module.Import(method)));
>>
>> > When viewing in C# mode in Reflector it bugs out and crashes (IL mode
>> > displays fine).
>>
>> > Anyone have any ideas on this one?
>>
>> It may be simply be the case that the code you're injecting is
>> confusing Reflector's decompiler. Especially as `ldtoken method` has
>> no C# representation (iirc, Reflector outputs a non existing methodof
>> operator in this case), so in the end, it's impossible to know without
>> having a full IL sample of a method after you instrumented it.
>
> --
> --
> mono-cecil

-- 
--
mono-cecil

Reply via email to