Exemplo n.º 1
0
        static CalliHelper()
        {
            // generate void(void) calli
            DynamicMethod dm = new DynamicMethod("void_calli",
                                                 typeof(void),
                                                 new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */ },
                                                 typeof(CalliHelper).Module);
            ILGenerator ilg = dm.GetILGenerator();

            ilg.Emit(OpCodes.Ldarg_1);
            ilg.Emit(OpCodes.Ldarg_0);
            ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[0], null);
            ilg.Emit(OpCodes.Ret);
            ArglessFunctionCaller = (ArglessMethod)dm.CreateDelegate(typeof(ArglessMethod));

            // generate void(Object, EventArgs) calli
            dm = new DynamicMethod("eventarg_calli",
                                   typeof(void),
                                   new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */, typeof(Object) /* sender */, typeof(EventArgs) },
                                   typeof(CalliHelper).Module);
            ilg = dm.GetILGenerator();

            ilg.Emit(OpCodes.Ldarg_1);
            ilg.Emit(OpCodes.Ldarg_2);
            ilg.Emit(OpCodes.Ldarg_3);
            ilg.Emit(OpCodes.Ldarg_0);
            ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object) /* sender */, typeof(EventArgs) }, null);
            ilg.Emit(OpCodes.Ret);
            EventArgFunctionCaller = (EventArgMethod)dm.CreateDelegate(typeof(EventArgMethod));
        }
        static CalliHelper() {
            // generate void(void) calli
            DynamicMethod dm = new DynamicMethod("void_calli",
                                                    typeof(void),
                                                    new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */},
                                                    typeof(CalliHelper).Module);
            ILGenerator ilg = dm.GetILGenerator();

            ilg.Emit(OpCodes.Ldarg_1);
            ilg.Emit(OpCodes.Ldarg_0);
            ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[0], null);
            ilg.Emit(OpCodes.Ret);
            ArglessFunctionCaller = (ArglessMethod)dm.CreateDelegate(typeof(ArglessMethod));

            // generate void(Object, EventArgs) calli
            dm = new DynamicMethod("eventarg_calli",
                                    typeof(void),
                                    new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */, typeof(Object) /* sender */, typeof(EventArgs) },
                                    typeof(CalliHelper).Module);
            ilg = dm.GetILGenerator();

            ilg.Emit(OpCodes.Ldarg_1);
            ilg.Emit(OpCodes.Ldarg_2);
            ilg.Emit(OpCodes.Ldarg_3);
            ilg.Emit(OpCodes.Ldarg_0);
            ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object) /* sender */, typeof(EventArgs) }, null);
            ilg.Emit(OpCodes.Ret);
            EventArgFunctionCaller = (EventArgMethod)dm.CreateDelegate(typeof(EventArgMethod));
        }