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); }