Esempio n. 1
0
    private static void OneTimeSetup()
    {
        Type stackFrameHelperType =
            typeof(object).Assembly.GetType("System.Diagnostics.StackFrameHelper");


        MethodInfo getStackFramesInternal =
            Type.GetType("System.Diagnostics.StackTrace, mscorlib").GetMethod(
                "GetStackFramesInternal", BindingFlags.Static | BindingFlags.NonPublic);


        DynamicMethod dynamicMethod = new DynamicMethod(
            "GetStackFrameHelper", typeof(object), new Type[0], typeof(StackTrace), true);

        ILGenerator generator = dynamicMethod.GetILGenerator();

        generator.DeclareLocal(stackFrameHelperType);
        generator.Emit(OpCodes.Ldc_I4_0);
        generator.Emit(OpCodes.Ldnull);
        generator.Emit(OpCodes.Newobj,
                       stackFrameHelperType.GetConstructor(new Type[] { typeof(bool), typeof(Thread) }));
        generator.Emit(OpCodes.Stloc_0);
        generator.Emit(OpCodes.Ldloc_0);
        generator.Emit(OpCodes.Ldc_I4_0);
        generator.Emit(OpCodes.Ldnull);
        generator.Emit(OpCodes.Call, getStackFramesInternal);
        generator.Emit(OpCodes.Ldloc_0);
        generator.Emit(OpCodes.Ret);


        _getStackFrameHelper =
            (DGetStackFrameHelper)dynamicMethod.CreateDelegate(typeof(DGetStackFrameHelper));


        _frameCount = stackFrameHelperType.GetField(
            "iFrameCount", BindingFlags.NonPublic | BindingFlags.Instance);
    }
    private static void OneTimeSetup()
    {
        try
        {
            Type stackFrameHelperType =
                typeof(object).Assembly.GetType("System.Diagnostics.StackFrameHelper");

            // ReSharper disable once PossibleNullReferenceException
            MethodInfo getStackFramesInternal =
                Type.GetType("System.Diagnostics.StackTrace, mscorlib").GetMethod(
                    "GetStackFramesInternal", BindingFlags.Static | BindingFlags.NonPublic);
            if (getStackFramesInternal == null)
            {
                return;     // Unknown mscorlib implementation
            }
            DynamicMethod dynamicMethod = new DynamicMethod(
                "GetStackFrameHelper", typeof(object), new Type[0], typeof(StackTrace), true);

            ILGenerator generator = dynamicMethod.GetILGenerator();
            generator.DeclareLocal(stackFrameHelperType);

            bool newDotNet = false;

            ConstructorInfo constructorInfo =
                stackFrameHelperType.GetConstructor(new Type[] { typeof(bool), typeof(Thread) });
            if (constructorInfo != null)
            {
                generator.Emit(OpCodes.Ldc_I4_0);
            }
            else
            {
                constructorInfo = stackFrameHelperType.GetConstructor(new Type[] { typeof(Thread) });
                if (constructorInfo == null)
                {
                    return;   // Unknown mscorlib implementation
                }
                newDotNet = true;
            }

            generator.Emit(OpCodes.Ldnull);
            generator.Emit(OpCodes.Newobj, constructorInfo);
            generator.Emit(OpCodes.Stloc_0);
            generator.Emit(OpCodes.Ldloc_0);
            generator.Emit(OpCodes.Ldc_I4_0);

            if (newDotNet)
            {
                generator.Emit(OpCodes.Ldc_I4_0);     // Extra parameter
            }
            generator.Emit(OpCodes.Ldnull);
            generator.Emit(OpCodes.Call, getStackFramesInternal);
            generator.Emit(OpCodes.Ldloc_0);
            generator.Emit(OpCodes.Ret);


            _getStackFrameHelper =
                (DGetStackFrameHelper)dynamicMethod.CreateDelegate(typeof(DGetStackFrameHelper));


            _frameCount = stackFrameHelperType.GetField("iFrameCount",
                                                        BindingFlags.NonPublic | BindingFlags.Instance);
        }
        catch
        {}       // _frameCount remains null, indicating unknown mscorlib implementation
    }