示例#1
0
        public object Create(Type interfaceType, object objInstance)
        {
            Type   interceptorType                      = _InterceptorInstance.GetType();
            Type   instanceType                         = objInstance == null ? interfaceType : objInstance.GetType();
            string dynamicProxyTypeFullName             = instanceType.Namespace + instanceType.Name + DynamicProxyName;
            DynamicProxyContainer dynamicProxyContainer = _DynamicProxyContainerManager.GetDynamicProxyContainerByDynamicProxyTypeName(dynamicProxyTypeFullName);
            Type dynamicProxyType                       = null;

            if (dynamicProxyContainer == null)
            {
                //定义类型(持久化)
                //var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(instanceType.Name), AssemblyBuilderAccess.RunAndSave);
                //瞬时
                var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(instanceType.Name), AssemblyBuilderAccess.Run);
                //持久化模块
                //var modulebuilder = asm.DefineDynamicModule(instanceType.Name, instanceType.Name + "EiapProxy.dll");
                //瞬时模块
                var modulebuilder = asm.DefineDynamicModule(dynamicProxyTypeFullName + ".dll");
                var typeBuilder   = modulebuilder.DefineType(dynamicProxyTypeFullName, TypeAttributes.Public, typeof(object), new Type[] { interfaceType });

                //定义字段
                var interceptorField = typeBuilder.DefineField("_" + interceptorType.Name, interceptorType, FieldAttributes.Private);
                var instanceField    = typeBuilder.DefineField("_" + instanceType.Name, instanceType, FieldAttributes.Private);

                //定义属性
                //var instanceProperty = typeBuilder.DefineProperty(instanceType.Name, PropertyAttributes.HasDefault, instanceType, Type.EmptyTypes);
                //var interceptorProperty = typeBuilder.DefineProperty(interceptorType.Name, PropertyAttributes.HasDefault, interceptorType, Type.EmptyTypes);

                //定义属性方法
                //var setInstancePropertyMethodBuilder = typeBuilder.DefineMethod("Set_" + instanceProperty.Name, MethodAttributes.Public, null, new Type[] { instanceType });
                //var setInterceptorPropertyMethodBuilder = typeBuilder.DefineMethod("Set_" + interceptorType.Name, MethodAttributes.Public, null, new Type[] { interceptorType });

                //ILGenerator setInstanceField_il = setInstancePropertyMethodBuilder.GetILGenerator();
                //setInstanceField_il.Emit(OpCodes.Ldarg_0);
                //setInstanceField_il.Emit(OpCodes.Ldarg_2);
                //setInstanceField_il.Emit(OpCodes.Stfld, instanceField);
                //setInstanceField_il.Emit(OpCodes.Ret);

                //ILGenerator setInterceptorField_il = setInterceptorPropertyMethodBuilder.GetILGenerator();
                //setInterceptorField_il.Emit(OpCodes.Ldarg_0);
                //setInterceptorField_il.Emit(OpCodes.Ldarg_1);
                //setInterceptorField_il.Emit(OpCodes.Stfld, interceptorField);
                //setInterceptorField_il.Emit(OpCodes.Ret);

                //关联,分别把set方法跟相应的属性中set块对应
                //instanceProperty.SetSetMethod(setInstancePropertyMethodBuilder);
                //interceptorProperty.SetSetMethod(setInterceptorPropertyMethodBuilder);

                //无参构造函数
                //ConstructorBuilder nonConBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, Type.EmptyTypes);
                //ILGenerator nonConIl = nonConBuilder.GetILGenerator();
                //nonConIl.Emit(OpCodes.Ret);

                //两个参数的构造函数
                var constructorbuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, new Type[] { interceptorType, instanceType });//new Type[] { instanceType }
                var conil = constructorbuilder.GetILGenerator();
                conil.Emit(OpCodes.Ldarg_0);
                conil.Emit(OpCodes.Ldarg_1);
                //conil.Emit(OpCodes.Newobj, interceptorType.GetConstructor(Type.EmptyTypes));
                conil.Emit(OpCodes.Stfld, interceptorField);
                conil.Emit(OpCodes.Ldarg_0);
                conil.Emit(OpCodes.Ldarg_2);
                conil.Emit(OpCodes.Stfld, instanceField);
                conil.Emit(OpCodes.Ret);

                //获取接口及基类接口方法
                var    methods       = interfaceType.GetMethods(BindingFlags.Public | BindingFlags.Instance).ToList();
                Type[] baseInterface = interfaceType.GetInterfaces();
                foreach (Type baseInterfaceItem in baseInterface)
                {
                    methods.AddRange(baseInterfaceItem.GetMethods(BindingFlags.Public | BindingFlags.Instance).ToList());
                }
                var methodList = GetInterfaceMethod(methods);
                //构造代理方法
                for (var i = 0; i < methods.Count; i++)
                {
                    Type[]           paramtypes       = GetParametersType(methods[i]);
                    MethodAttributes methodAttributes = MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig;
                    var methodbuilder = typeBuilder.DefineMethod(methods[i].Name, methodAttributes, CallingConventions.Standard, methods[i].ReturnType, paramtypes);
                    if (methods[i].IsGenericMethod)
                    {
                        Type[] methodGenericArguments = methods[i].GetGenericArguments();
                        methodbuilder.DefineGenericParameters(methodGenericArguments.Select(m => m.Name).ToArray());
                    }

                    var il = methodbuilder.GetILGenerator();
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldfld, interceptorField);
                    //il.Emit(OpCodes.Newobj, instanceType.GetConstructor(Type.EmptyTypes));
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldfld, instanceField);
                    il.Emit(OpCodes.Ldstr, methods[i].Name);

                    if (paramtypes == null)
                    {
                        il.Emit(OpCodes.Ldnull);
                    }
                    else
                    {
                        var parameters = il.DeclareLocal(typeof(object[]));
                        il.Emit(OpCodes.Ldc_I4, paramtypes.Length);
                        il.Emit(OpCodes.Newarr, typeof(object));
                        il.Emit(OpCodes.Stloc, parameters);
                        for (var j = 0; j < paramtypes.Length; j++)
                        {
                            il.Emit(OpCodes.Ldloc, parameters);
                            il.Emit(OpCodes.Ldc_I4, j);
                            il.Emit(OpCodes.Ldarg, j + 1);
                            il.Emit(OpCodes.Box, paramtypes[j]);
                            il.Emit(OpCodes.Stelem_Ref);
                        }
                        il.Emit(OpCodes.Ldloc, parameters);
                    }
                    il.Emit(OpCodes.Callvirt, interceptorType.GetMethod("Invoke"));
                    if (methods[i].ReturnType == typeof(void))
                    {
                        il.Emit(OpCodes.Pop);
                    }
                    else if (methods[i].ReturnType.IsValueType)
                    {
                        il.Emit(OpCodes.Unbox_Any, methods[i].ReturnType);
                    }
                    il.Emit(OpCodes.Ret);
                }
                dynamicProxyType = typeBuilder.CreateType();
                _DynamicProxyContainerManager.AddDynamicProxyContainer(new DynamicProxyContainer {
                    DynamicProxyTypeFullName = dynamicProxyTypeFullName, DynamicProxyTypeHandle = dynamicProxyType.TypeHandle
                });
            }
            else
            {
                dynamicProxyType = dynamicProxyContainer.DynamicProxyType;
            }

            //持久化
            //asm.Save(instanceType.Name + "EiapProxy.dll");
            return(Activator.CreateInstance(dynamicProxyType, new object[] { _InterceptorInstance, objInstance }));
        }
 /// <summary>
 /// 添加动态代理容器
 /// </summary>
 /// <param name="container"></param>
 public void AddDynamicProxyContainer(DynamicProxyContainer container)
 {
     _DynamicProxyContainerList.Add(container.DynamicProxyTypeFullName, container);
 }