/// <summary>
 /// Create all internal structures.
 /// </summary>
 public override void Create(ProxySerializationContext context)
 {
     ProcessSerializationAttribute();
     ProcessWebAttribute();
     ProcessInputArguments();
     ProcessSerializers(context);
 }
 /// <summary>
 /// Create all internal structures.
 /// </summary>
 public override void Create(ProxySerializationContext context)
 {
     ProcessSerializationAttribute();
     ProcessWebAttribute();
     ProcessInputArguments();
     ProcessSerializers(context);
 }
示例#3
0
        /// <summary>
        /// Build all proxies
        /// </summary>
        public void Build()
        {
            // Collect all types that are ServiceContract interfaces
            var serviceContractIntfTypes = assemblies.SelectMany(x => x.MainModule.GetTypes()).Where(x => x.IsInterface && x.HasServiceContractAttribute());
            var proxyBuilders = serviceContractIntfTypes.Select(x => new ProxyClassBuilder(x)).ToList();

            // Build structures
            var context = new ProxySerializationContext();
            proxyBuilders.ForEach(x => x.Create(context));
            context.Create(context);

            // Generate code
            var code = new StringBuilder(128 * 1024);
            using (var codeWriter = new StringWriter(code))
            {
                var codeGenerator = new CodeGenerator();
                proxyBuilders.ForEach(x => x.Generate(codeGenerator));
                context.Generate(codeGenerator);
                codeGenerator.Generate(codeWriter);
            }

            // Load existing C# code
            var existingCode = File.Exists(generatedSourcePath) ? File.ReadAllText(generatedSourcePath) : string.Empty;
            var generatedCode = code.ToString();
            if (existingCode != generatedCode)
            {
                // Ensure directory exists
                Directory.CreateDirectory(Path.GetDirectoryName(generatedSourcePath));

                // Write C#
                File.WriteAllText(generatedSourcePath, generatedCode);
            }
        }
        /// <summary>
        /// Create all internal structures.
        /// </summary>
        public void Create(ProxySerializationContext context)
        {
            foreach (var property in type.Properties)
            {
                if (!Ignore(property))
                {
                    var builder       = context.GetDeserializer(property.PropertyType.Resolve());
                    var builderHelper = new DeserializerBuilderHelper
                    {
                        TypeDeserializerBuilder = builder,
                        PropertyName            = property.Name
                    };

                    FillBuilderHelper(type, property, builderHelper);

                    builders.Add(property.Name, builderHelper);
                }
            }
        }
        /// <summary>
        /// Create all internal structures.
        /// </summary>
        public void Create(ProxySerializationContext context)
        {
            foreach (var property in type.Properties)
            {
                if (!Ignore(property))
                {
                    var builder = context.GetDeserializer(property.PropertyType.Resolve());
                    var builderHelper = new DeserializerBuilderHelper
                        {
                            TypeDeserializerBuilder = builder,
                            PropertyName = property.Name
                        };

                    FillBuilderHelper(type, property, builderHelper);

                    builders.Add(property.Name, builderHelper);
                }
            }
        }
        /// <summary>
        /// Create all internal structures
        /// </summary>
        public void Create(ProxySerializationContext context)
        {
            var start = 0;
            var serializeBuilders = typeSerializerBuilders.Values.Skip(start).ToArray();
            while (serializeBuilders.Any())
            {
                serializeBuilders.ForEach(x => x.Create(context));
                start = start + serializeBuilders.Length;
                serializeBuilders = typeSerializerBuilders.Values.Skip(start).ToArray();
            }

            start = 0;
            var deserializeBuilders = typeDeserializerBuilders.Values.Skip(start).ToArray();
            while (deserializeBuilders.Any())
            {
                deserializeBuilders.ForEach(x => x.Create(context));
                start = start + deserializeBuilders.Length;
                deserializeBuilders = typeDeserializerBuilders.Values.Skip(start).ToArray();
            }
        }
        private void ProcessSerializers(ProxySerializationContext context)
        {
            if (InterfaceMethod.ReturnType != null)
            {
                var typeDefinition = InterfaceMethod.ReturnType.Resolve();
                if (typeDefinition.FullName != "System.Void")
                {
                    typeDeserializerBuilder = context.GetDeserializer(typeDefinition);
                    deserializerTypeIsArray = InterfaceMethod.ReturnType.IsArray;
                }
            }

            if (!string.IsNullOrEmpty(toSerializeArgument))
            {
                var parameter      = InterfaceMethod.Parameters.First(p => p.Name == toSerializeArgument);
                var typeDefinition = parameter.ParameterType.Resolve();
                typeSerializerBuilder = context.GetSerializer(typeDefinition);
                serializerTypeIsArray = parameter.ParameterType.IsArray;
            }
        }
示例#8
0
        /// <summary>
        /// Create all internal structures.
        /// </summary>
        public void Create(ProxySerializationContext context)
        {
            ProcessSerializationAttribute();

            // Create type name of proxy class
            proxyTypeName = interfaceType.Name + "__WcfProxy";

            // Collect all methods for which we have to build a proxy
            var operationMethods = new List<MethodDefinition>();
            var otherMethods = new List<MethodDefinition>();
            var processed = new HashSet<TypeDefinition>();
            CollectOperationMethods(operationMethods, otherMethods, interfaceType, processed);

            // Prepare method proxy builders
            methodBuilders = new List<ProxyMethodBuilder>();
            methodBuilders.AddRange(operationMethods.Select(x => new ProxyOperationContractMethodBuilder(this, x)));
            methodBuilders.AddRange(otherMethods.Select(x => new ProxyNotSupportedMethodBuilder(this, x)));

            // Prepare internal structures of method builders
            methodBuilders.ForEach(x => x.Create(context));
        }
示例#9
0
        /// <summary>
        /// Create all internal structures.
        /// </summary>
        public void Create(ProxySerializationContext context)
        {
            ProcessSerializationAttribute();

            // Create type name of proxy class
            proxyTypeName = interfaceType.Name + "__WcfProxy";

            // Collect all methods for which we have to build a proxy
            var operationMethods = new List <MethodDefinition>();
            var otherMethods     = new List <MethodDefinition>();
            var processed        = new HashSet <TypeDefinition>();

            CollectOperationMethods(operationMethods, otherMethods, interfaceType, processed);

            // Prepare method proxy builders
            methodBuilders = new List <ProxyMethodBuilder>();
            methodBuilders.AddRange(operationMethods.Select(x => new ProxyOperationContractMethodBuilder(this, x)));
            methodBuilders.AddRange(otherMethods.Select(x => new ProxyNotSupportedMethodBuilder(this, x)));

            // Prepare internal structures of method builders
            methodBuilders.ForEach(x => x.Create(context));
        }
        /// <summary>
        /// Create all internal structures
        /// </summary>
        public void Create(ProxySerializationContext context)
        {
            var start             = 0;
            var serializeBuilders = typeSerializerBuilders.Values.Skip(start).ToArray();

            while (serializeBuilders.Any())
            {
                serializeBuilders.ForEach(x => x.Create(context));
                start             = start + serializeBuilders.Length;
                serializeBuilders = typeSerializerBuilders.Values.Skip(start).ToArray();
            }

            start = 0;
            var deserializeBuilders = typeDeserializerBuilders.Values.Skip(start).ToArray();

            while (deserializeBuilders.Any())
            {
                deserializeBuilders.ForEach(x => x.Create(context));
                start = start + deserializeBuilders.Length;
                deserializeBuilders = typeDeserializerBuilders.Values.Skip(start).ToArray();
            }
        }
示例#11
0
        /// <summary>
        /// Build all proxies
        /// </summary>
        public void Build()
        {
            // Collect all types that are ServiceContract interfaces
            var serviceContractIntfTypes = assemblies.SelectMany(x => x.MainModule.GetTypes()).Where(x => x.IsInterface && x.HasServiceContractAttribute());
            var proxyBuilders            = serviceContractIntfTypes.Select(x => new ProxyClassBuilder(x)).ToList();

            // Build structures
            var context = new ProxySerializationContext();

            proxyBuilders.ForEach(x => x.Create(context));
            context.Create(context);

            // Generate code
            var code = new StringBuilder(128 * 1024);

            using (var codeWriter = new StringWriter(code))
            {
                var codeGenerator = new CodeGenerator();
                proxyBuilders.ForEach(x => x.Generate(codeGenerator));
                context.Generate(codeGenerator);
                codeGenerator.Generate(codeWriter);
            }

            // Load existing C# code
            var existingCode  = File.Exists(generatedSourcePath) ? File.ReadAllText(generatedSourcePath) : string.Empty;
            var generatedCode = code.ToString();

            if (existingCode != generatedCode)
            {
                // Ensure directory exists
                Directory.CreateDirectory(Path.GetDirectoryName(generatedSourcePath));

                // Write C#
                File.WriteAllText(generatedSourcePath, generatedCode);
            }
        }
示例#12
0
 /// <summary>
 /// Create all internal structures.
 /// </summary>
 public abstract void Create(ProxySerializationContext context);
 /// <summary>
 /// Create all internal structures.
 /// </summary>
 public override void Create(ProxySerializationContext context)
 {
     // Do nothing
 }
示例#14
0
 /// <summary>
 /// Create all internal structures.
 /// </summary>
 public abstract void Create(ProxySerializationContext context);
 /// <summary>
 /// Create all internal structures.
 /// </summary>
 public override void Create(ProxySerializationContext context)
 {
     // Do nothing
 }
        private void ProcessSerializers(ProxySerializationContext context)
        {
            if (InterfaceMethod.ReturnType != null)
            {
                var typeDefinition = InterfaceMethod.ReturnType.Resolve();
                if (typeDefinition.FullName != "System.Void")
                {
                    typeDeserializerBuilder = context.GetDeserializer(typeDefinition);
                    deserializerTypeIsArray = InterfaceMethod.ReturnType.IsArray;
                }
            }

            if (!string.IsNullOrEmpty(toSerializeArgument))
            {
                var parameter = InterfaceMethod.Parameters.First(p => p.Name == toSerializeArgument);
                var typeDefinition = parameter.ParameterType.Resolve();
                typeSerializerBuilder = context.GetSerializer(typeDefinition);
                serializerTypeIsArray = parameter.ParameterType.IsArray;
            }
        }