예제 #1
0
 private static void CheckBuildPreconditions(this ProxyContext @this)
 {
     if (@this == null)
     {
         throw new ArgumentNullException("this", ProxyBuilder.ErrorProxyContextIsNull);
     }
 }
예제 #2
0
        public static void Build(ReadOnlyCollection<Type> targets, ProxyContext context)
        {
            targets.CheckBuildPreconditions();
            context.CheckBuildPreconditions();

            foreach (var target in targets)
            {
                target.CheckBuildPreconditions();
            }

            var nonProxiedTypes = new List<Type>(
                targets.Where(target =>
                {
                    return !BuiltProxies.Mappings.ContainsKey(target);
                })
            );

            if (nonProxiedTypes.Count > 0)
            {
                var items = ProxyBuilder.Generate(targets[0], context);

                foreach (var target in targets)
                {
                    ProxyBuilder.Build(target, items);
                }

                ProxyBuilder.Save(items.Assembly, context);
            }
        }
예제 #3
0
        public static void Build(ReadOnlyCollection <Type> targets, ProxyContext context)
        {
            targets.CheckBuildPreconditions();
            context.CheckBuildPreconditions();

            foreach (var target in targets)
            {
                target.CheckBuildPreconditions();
            }

            var nonProxiedTypes = new List <Type>(
                targets.Where(target =>
            {
                return(!BuiltProxies.Mappings.ContainsKey(target));
            })
                );

            if (nonProxiedTypes.Count > 0)
            {
                var items = ProxyBuilder.Generate(targets[0], context);

                foreach (var target in targets)
                {
                    ProxyBuilder.Build(target, items);
                }

                ProxyBuilder.Save(items.Assembly, context);
            }
        }
예제 #4
0
 public static void Build(Type target, ProxyContext context)
 {
     target.CheckBuildPreconditions();
     context.CheckBuildPreconditions();
     var items = ProxyBuilder.Generate(target, context);
     ProxyBuilder.Build(target, items);
     ProxyBuilder.Save(items.Assembly, context);
 }
예제 #5
0
        public static void Build(Type target, ProxyContext context)
        {
            target.CheckBuildPreconditions();
            context.CheckBuildPreconditions();
            var items = ProxyBuilder.Generate(target, context);

            ProxyBuilder.Build(target, items);
            ProxyBuilder.Save(items.Assembly, context);
        }
예제 #6
0
        private static void Save(AssemblyBuilder assembly, ProxyContext context)
        {
            if ((context.Access & AssemblyBuilderAccess.Save) == AssemblyBuilderAccess.Save)
            {
                assembly.Save(assembly.GetName().Name + ".dll");

                if (context.Verify)
                {
                    AssemblyVerification.Verify(assembly);
                }
            }
        }
예제 #7
0
        private static ProxyBuilderGeneratorItems Generate(Type target, ProxyContext context)
        {
            var proxyAssemblyName = target.Assembly.GetName().Clone() as AssemblyName;

            proxyAssemblyName.Name = target.Namespace + "." +
                                     target.Name + "." + Proxy.ProxyExtension;

            var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(
                proxyAssemblyName, context.Access);

            if (context.GenerateDebugging)
            {
                var debugAttribute   = typeof(DebuggableAttribute);
                var debugConstructor = debugAttribute.GetConstructor(
                    new Type[] { typeof(DebuggableAttribute.DebuggingModes) });
                var debugBuilder = new CustomAttributeBuilder(
                    debugConstructor, new object[] {
                    DebuggableAttribute.DebuggingModes.DisableOptimizations |
                    DebuggableAttribute.DebuggingModes.Default
                });
                assembly.SetCustomAttribute(debugBuilder);
            }

            ModuleBuilder module = null;

            if ((context.Access & AssemblyBuilderAccess.Save) == AssemblyBuilderAccess.Save)
            {
                module = assembly.DefineDynamicModule(assembly.GetName().Name,
                                                      assembly.GetName().Name + ".dll", context.GenerateDebugging);
            }
            else
            {
                module = assembly.DefineDynamicModule(assembly.GetName().Name,
                                                      context.GenerateDebugging);
            }

            ISymbolDocumentWriter symbolDocumentWriter = null;

            if (context.GenerateDebugging)
            {
                symbolDocumentWriter = module.DefineDocument(
                    assembly.GetName().Name + ".il", SymDocumentType.Text,
                    SymLanguageType.ILAssembly, SymLanguageVendor.Microsoft);
            }

            return(new ProxyBuilderGeneratorItems(assembly, module, symbolDocumentWriter));
        }
예제 #8
0
 public static T Create <T>(ProxyContext context, params IInvocationHandler[] handlers)
     where T : class, new()
 {
     return(new T().CreateProxy(context, handlers));
 }
예제 #9
0
        private static void Save(AssemblyBuilder assembly, ProxyContext context)
        {
            if ((context.Access & AssemblyBuilderAccess.Save) == AssemblyBuilderAccess.Save)
            {
                assembly.Save(assembly.GetName().Name + ".dll");

                if (context.Verify)
                {
                    AssemblyVerification.Verify(assembly);
                }
            }
        }
예제 #10
0
        private static ProxyBuilderGeneratorItems Generate(Type target, ProxyContext context)
        {
            var proxyAssemblyName = target.Assembly.GetName().Clone() as AssemblyName;
            proxyAssemblyName.Name = target.Namespace + "." +
                target.Name + "." + Proxy.ProxyExtension;

            var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(
                proxyAssemblyName, context.Access);

            if (context.GenerateDebugging)
            {
                var debugAttribute = typeof(DebuggableAttribute);
                var debugConstructor = debugAttribute.GetConstructor(
                     new Type[] { typeof(DebuggableAttribute.DebuggingModes) });
                var debugBuilder = new CustomAttributeBuilder(
                     debugConstructor, new object[] {
                        DebuggableAttribute.DebuggingModes.DisableOptimizations |
                        DebuggableAttribute.DebuggingModes.Default });
                assembly.SetCustomAttribute(debugBuilder);
            }

            ModuleBuilder module = null;

            if ((context.Access & AssemblyBuilderAccess.Save) == AssemblyBuilderAccess.Save)
            {
                module = assembly.DefineDynamicModule(assembly.GetName().Name,
                    assembly.GetName().Name + ".dll", context.GenerateDebugging);
            }
            else
            {
                module = assembly.DefineDynamicModule(assembly.GetName().Name,
                    context.GenerateDebugging);
            }

            ISymbolDocumentWriter symbolDocumentWriter = null;

            if (context.GenerateDebugging)
            {
                symbolDocumentWriter = module.DefineDocument(
                    assembly.GetName().Name + ".il", SymDocumentType.Text,
                    SymLanguageType.ILAssembly, SymLanguageVendor.Microsoft);
            }

            return new ProxyBuilderGeneratorItems(assembly, module, symbolDocumentWriter);
        }