示例#1
0
 private DynamicMethodInfo[] CreateDynamicMethods(Type type, string methodName)
 {
     MethodInfo[]        mis  = DynamicHelpers.GetMethods(type, methodName);
     DynamicMethodInfo[] list = new DynamicMethodInfo[mis.Length];
     Type[] types;
     for (int i = 0; i < mis.Length; i++)
     {
         ParameterInfo[] pis = mis[i].GetParameters();
         types = new Type[pis.Length];
         for (int j = 0; j < pis.Length; j++)
         {
             types[j] = pis[j].ParameterType;
         }
         list[i] = CreateExcuteMethodProxy(type, mis[i]);
     }
     return(list);
 }
示例#2
0
        private DynamicMethodInfo CreateExcuteMethodProxy(Type type, MethodInfo mi)
        {
            Type objectType = typeof(object);

            Type[] parameterTypes =
            {
                objectType,
                typeof(object[])
            };
            DynamicMethod dynamicMethod = new DynamicMethod(
                string.Concat("M_", TypeToName(type), "_", mi.Name),
                objectType,
                parameterTypes);

            ILGenerator il = dynamicMethod.GetILGenerator();

            il.DeclareLocal(type);//0

            il.Emit(OpCodes.Ldarg_0);
            if (IsValueType(type))
            {
                il.Emit(OpCodes.Unbox_Any, type);
            }
            else
            {
                il.Emit(OpCodes.Castclass, type);
            }
            il.Emit(OpCodes.Stloc_0);

            ParameterInfo[] pis   = mi.GetParameters();
            int             index = pis.Length;

            for (int i = 0; i < index; i++)
            {
                il.DeclareLocal(pis[i].ParameterType);
                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Ldc_I4, i);
                il.Emit(OpCodes.Ldelem_Ref);
                if (IsValueType(pis[i].ParameterType))
                {
                    //此处不需要考虑TryParse,因为实参类型必须与形参一致
                    il.Emit(OpCodes.Unbox_Any, pis[i].ParameterType);
                }
                else
                {
                    if (pis[i].ParameterType.FullName != "System.Object")
                    {
                        il.Emit(OpCodes.Castclass, pis[i].ParameterType);
                    }
                }
                il.Emit(OpCodes.Stloc, i + 1);
            }
            Ldloc(type, il, 0);
            for (int i = 0; i < index; i++)
            {
                il.Emit(OpCodes.Ldloc, i + 1);
            }
            Call(type, il, mi);
            switch (mi.ReturnType.FullName)
            {
            case "System.Void":
                il.Emit(OpCodes.Ldnull);
                break;

            case "System.Object":
                break;

            default:
                if (IsValueType(mi.ReturnType))
                {
                    il.Emit(OpCodes.Box, mi.ReturnType);
                }
                else
                {
                    il.Emit(OpCodes.Castclass, objectType);
                }
                break;
            }
            //il.Emit(OpCodes.Ldnull);
            il.Emit(OpCodes.Ret);

            DynamicMethodInfo model = new DynamicMethodInfo();

            model.Delegate   = dynamicMethod.CreateDelegate(typeof(ExcuteMethodDelegate)) as ExcuteMethodDelegate;
            model.FullName   = string.Concat(TypeToName(type), "_", mi.Name);
            model.Name       = mi.Name;
            model.Parameters = pis;
            return(model);
        }
示例#3
0
        private DynamicMethodInfo CreateExcuteMethodProxy(Type type, MethodInfo mi)
        {
            Type objectType = typeof(Object);
            Type[] parameterTypes = {
                objectType,
                typeof(Object[])
            };
            DynamicMethod dynamicMethod = new DynamicMethod(
                String.Concat("DynamicMethod.ExcuteMethod.", type.FullName, ".", mi.Name),
                objectType,
                parameterTypes);

            ILGenerator il = dynamicMethod.GetILGenerator();
            il.DeclareLocal(type);//0

            il.Emit(OpCodes.Ldarg_0);
            if (type.IsValueType)
            {
                il.Emit(OpCodes.Unbox_Any, type);
            }
            else
            {
                il.Emit(OpCodes.Castclass, type);
            }
            il.Emit(OpCodes.Stloc_0);

            ParameterInfo[] pis = mi.GetParameters();
            Int32 index = pis.Length;
            for (Int32 i = 0; i < index; i++)
            {
                il.DeclareLocal(pis[i].ParameterType);
                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Ldc_I4, i);
                il.Emit(OpCodes.Ldelem_Ref);
                if (pis[i].ParameterType.IsValueType)
                {
                    //此处不需要考虑TryParse,因为实参类型必须与形参一致
                    il.Emit(OpCodes.Unbox_Any, pis[i].ParameterType);
                }
                else
                {
                    if (pis[i].ParameterType.FullName != "System.Object")
                    {
                        il.Emit(OpCodes.Castclass, pis[i].ParameterType);
                    }
                }
                il.Emit(OpCodes.Stloc, i + 1);
            }
            Ldloc(type, il, 0);
            for (Int32 i = 0; i < index; i++)
            {
                il.Emit(OpCodes.Ldloc, i + 1);
            }
            Call(type, il, mi);
            switch (mi.ReturnType.FullName)
            {
                case "System.Void":
                    il.Emit(OpCodes.Ldnull);
                    break;
                case "System.Object":
                    break;
                default:
                    if (mi.ReturnType.IsValueType)
                    {
                        il.Emit(OpCodes.Box, mi.ReturnType);
                    }
                    else
                    {
                        il.Emit(OpCodes.Castclass, objectType);
                    }
                    break;
            }
            //il.Emit(OpCodes.Ldnull);
            il.Emit(OpCodes.Ret);

            DynamicMethodInfo model = new DynamicMethodInfo();
            model.Delegate = dynamicMethod.CreateDelegate(typeof(ExcuteMethodDelegate)) as ExcuteMethodDelegate;
            model.FullName = String.Concat(type.FullName, ".", mi.Name);
            model.Name = mi.Name;
            model.Parameters = pis;
            return model;
        }