using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Description; using System.Runtime.Serialization; class Program { static void GenerateCSCodeForService(string gennamespace, EndpointAddress[] metadataAddresses, string outputFile) { MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddresses[0]); mexClient.ResolveMetadataReferences = true; var metaDocs = new MetadataSet( metadataAddresses .Select(ma => mexClient.GetMetadata(ma.Uri, MetadataExchangeClientMode.HttpGet)) .SelectMany(mds => mds.MetadataSections)); WsdlImporter importer = new WsdlImporter(metaDocs); ServiceContractGenerator generator = new ServiceContractGenerator(); generator.Options = ServiceContractGenerationOptions.AsynchronousMethods | ServiceContractGenerationOptions.ChannelInterface; generator.NamespaceMappings.Add("*", gennamespace); // Data contract options importer.State.Remove(typeof(XsdDataContractExporter)); var xsdDCImporter = new XsdDataContractImporter(); xsdDCImporter.Options = new ImportOptions() { EnableDataBinding = true }; xsdDCImporter.Options.Namespaces.Add("*", gennamespace); importer.State.Add(typeof(XsdDataContractImporter), xsdDCImporter); // Generate var contracts = importer.ImportAllContracts(); importer.ImportAllEndpoints(); // This return value isn't used. Not sure if that matters. foreach (ContractDescription contract in contracts) { generator.GenerateServiceContractType(contract); } if (generator.Errors.Count != 0) { generator.Errors.ToList().ForEach(mce => Console.WriteLine("{0}: {1}", mce.IsWarning ? "Warning" : "Error", mce.Message)); throw new Exception("There were errors during code compilation."); } // Call SL fixups var slfix = new Microsoft.Silverlight.ServiceReference.WcfSilverlightCodeGenerationExtension(); slfix.ClientGenerated(generator); // Write the code dom var options = new System.CodeDom.Compiler.CodeGeneratorOptions(); options.BracingStyle = "C"; var codeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("C#"); var textWriter = new System.CodeDom.Compiler.IndentedTextWriter(new System.IO.StreamWriter(outputFile)); codeDomProvider.GenerateCodeFromCompileUnit(generator.TargetCompileUnit, textWriter, options); textWriter.Close(); } static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: slsvchack .. "); } else { GenerateCSCodeForService(args[0], args.Skip(2).Select(a => new EndpointAddress(a)).ToArray(), args[1]); } } }