public Type CreateProxiedType(ModuleBuilder b, Type baseType, Type[] baseInterfaces)
        {
            string typeName = string.Format("{0}Proxy", baseType.Name);
            //
            const TypeAttributes attributes = TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.Public;
            var interfaces = new List <Type>();

            if ((baseInterfaces != null) && (baseInterfaces.Length > 0))
            {
                interfaces.AddRange(baseInterfaces);
            }
            var parent = baseType;

            if (baseType.IsInterface)
            {
                parent = typeof(ProxyDummy);
                interfaces.Add(baseType);
            }
            foreach (var @interface in interfaces.ToArray())
            {
                BuildInterfacesRecurse(@interface, interfaces);
            }
            if (!interfaces.Contains(typeof(ISerializable)))
            {
                interfaces.Add(typeof(ISerializable));
            }
            var typeBuilder        = b.DefineType(typeName, attributes, parent, interfaces.ToArray());
            var constructorBuilder = DefineConstructor(typeBuilder);
            var implementor        = new DynamicProxyImplementor();

            implementor.ImplementProxy(typeBuilder);
            var methods = baseType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
            var proxies = new List <MethodInfo>();

            BuildMethods(interfaces, methods, proxies);
            var interceptorField = implementor.InterceptorField;

            foreach (var proxy in proxies)
            {
                if (proxy.DeclaringType != typeof(ISerializable))
                {
                    ProxyMethodEmitter.CreateProxiedMethod(typeBuilder, interceptorField, proxy);
                }
            }
            AddSerializationSupport(typeBuilder, baseType, baseInterfaces, interceptorField, constructorBuilder);
            return(typeBuilder.CreateType());
        }
 public Type CreateProxiedType(ModuleBuilder b, Type baseType, Type[] baseInterfaces)
 {
     string typeName = string.Format("{0}Proxy", baseType.Name);
     //
     const TypeAttributes attributes = TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.Public;
     var interfaces = new List<Type>();
     if ((baseInterfaces != null) && (baseInterfaces.Length > 0))
         interfaces.AddRange(baseInterfaces);
     var parent = baseType;
     if (baseType.IsInterface)
     {
         parent = typeof(ProxyDummy);
         interfaces.Add(baseType);
     }
     foreach (var @interface in interfaces.ToArray())
         BuildInterfacesRecurse(@interface, interfaces);
     if (!interfaces.Contains(typeof(ISerializable)))
         interfaces.Add(typeof(ISerializable));
     var typeBuilder = b.DefineType(typeName, attributes, parent, interfaces.ToArray());
     var constructorBuilder = DefineConstructor(typeBuilder);
     var implementor = new DynamicProxyImplementor();
     implementor.ImplementProxy(typeBuilder);
     var methods = baseType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
     var proxies = new List<MethodInfo>();
     BuildMethods(interfaces, methods, proxies);
     var interceptorField = implementor.InterceptorField;
     foreach (var proxy in proxies)
         if (proxy.DeclaringType != typeof(ISerializable))
             ProxyMethodEmitter.CreateProxiedMethod(typeBuilder, interceptorField, proxy);
     AddSerializationSupport(typeBuilder, baseType, baseInterfaces, interceptorField, constructorBuilder);
     return typeBuilder.CreateType();
 }