Esempio n. 1
0
        private void EmitPrivateDelegate(MethodInfo methodInfo)
        {
            var typeOfDelegate = typeof(Delegate);
            var localArray     = ILGenerator.DeclareLocal(typeof(object[]));
            var parameters     = methodInfo.GetParameters();

            Locals.Add(localArray);
            ILGenerator.Emit(OpCodes.Castclass, typeOfDelegate);
            ILGenerator.EmitPushInteger(parameters.Length);
            ILGenerator.Emit(OpCodes.Newarr, TypeSystem.Object);
            ILGenerator.EmitStoreLocal(localArray);

            Node.AcceptVisitor(this, ILGenerator);

            ILGenerator.EmitLoadLocal(localArray);
            ILGenerator.Emit(OpCodes.Callvirt, typeOfDelegate.GetMethod("DynamicInvoke"));
            ILGenerator.Emit(OpCodes.Unbox_Any, methodInfo.ReturnType);
        }
Esempio n. 2
0
        private void EmitPrivate(MethodInfo methodInfo)
        {
            Type typeArrayType           = typeof(Type[]);
            Type objectArrayType         = typeof(object[]);
            Type methodInfoType          = typeof(MethodInfo);
            var  parameters              = methodInfo.GetParameters();
            var  localTypeArray          = ILGenerator.DeclareLocal(typeArrayType);
            var  localObjectArray        = ILGenerator.DeclareLocal(objectArrayType);
            var  getTypeFromHandleMethod = typeof(Type).GetMethod("GetTypeFromHandle");
            var  invocation              = methodInfoType.BaseType.GetMethod("Invoke", new Type[] { TypeSystem.Object, typeof(object[]) });

            Locals.Add(localTypeArray);
            Locals.Add(localObjectArray);
            ILGenerator.Emit(OpCodes.Ldtoken, methodInfo.DeclaringType);
            ILGenerator.Emit(OpCodes.Call, getTypeFromHandleMethod);
            ILGenerator.Emit(OpCodes.Ldstr, methodInfo.Name);
            ILGenerator.EmitPushInteger(Convert.ToInt32(BindingFlags.NonPublic | BindingFlags.Static));
            ILGenerator.Emit(OpCodes.Ldnull);
            ILGenerator.EmitPushInteger(parameters.Length);
            ILGenerator.Emit(OpCodes.Newarr, typeArrayType.GetElementType());
            ILGenerator.EmitStoreLocal(localTypeArray);

            parameters.ForEach((p, i) => {
                ILGenerator.EmitLoadLocal(localTypeArray);
                ILGenerator.EmitPushInteger(i);
                ILGenerator.Emit(OpCodes.Ldtoken, p.ParameterType);
                ILGenerator.Emit(OpCodes.Call, getTypeFromHandleMethod);
                ILGenerator.Emit(OpCodes.Stelem_Ref);
            });

            ILGenerator.EmitLoadLocal(localTypeArray);
            ILGenerator.Emit(OpCodes.Ldnull);
            ILGenerator.Emit(OpCodes.Call, typeof(Type).GetMethod("GetMethod", new Type[] { TypeSystem.String, typeof(BindingFlags), typeof(Binder), typeof(Type[]), typeof(SysReflection.ParameterModifier[]) }));
            ILGenerator.Emit(OpCodes.Ldnull);
            ILGenerator.EmitPushInteger(parameters.Length);
            ILGenerator.Emit(OpCodes.Newarr, TypeSystem.Object);
            ILGenerator.EmitStoreLocal(localObjectArray);

            Node.AcceptVisitor(this, ILGenerator);

            ILGenerator.EmitLoadLocal(localObjectArray);
            ILGenerator.Emit(OpCodes.Callvirt, invocation);
            ILGenerator.Emit(OpCodes.Unbox_Any, methodInfo.ReturnType);
        }