private static Type EmitProxyType(Type baseType, Type interfaceType) { AssemblyBuilder asmBuilder = ProxyUtils.GetAssemblyBuilder("DynamicProxyAssembly"); ModuleBuilder mBuilder = ProxyUtils.GetModule(asmBuilder, "EmittedProxies"); TypeBuilder tBuilder = ProxyUtils.GetType(mBuilder, String.Format("{0}{1}Proxy", baseType.FullName, interfaceType), baseType, new[] { interfaceType }); // Emit parametrized ctor var constructors = baseType.GetConstructors(); foreach (var ctor in constructors) { Debug.WriteLine(ctor.Name); EmitCtor(tBuilder, ctor); } // Get namespace information var namespaceAttr = ProxyUtils.GetCustomAttribute <ProxyNamespaceAttribute>(interfaceType); var ns = namespaceAttr == null ? "" : namespaceAttr.Namespace; // Create methods in interfaceType var superType = typeof(ProxyBase); var invokeMethod = superType.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.NonPublic); var convertMethod = superType.GetMethod("ConvertReturnValue", BindingFlags.Instance | BindingFlags.NonPublic); var methods = interfaceType.GetMethods(); foreach (var method in methods) { Debug.WriteLine(method.Name); EmitInterfaceMethod(tBuilder, ns, method, invokeMethod, convertMethod); } var proxyType = tBuilder.CreateType(); return(proxyType); }