Tengo una aplicación con complementos que genera el Contrato de Cliente WCF programáticamente y luego lo conecta a las interfaces de complementos, sin embargo, estoy luchando para encontrar la forma de obtener el contrato generado para reutilizar los tipos encontrado en el plugin dlls.Reutilice tipos al generar WCF Cliente Contrato programáticamente
¿Alguien sabe cómo configurar ServiceContractGenerator para reutilizar tipos en ensamblados definidos?
Esto es lo que yo uso para generar el código de contrato atm:
public Assembly CreateProxy(String url)
{
MetadataExchangeClient mexClient = new MetadataExchangeClient(new Uri(url + "/mex"), MetadataExchangeClientMode.MetadataExchange);
mexClient.ResolveMetadataReferences = true;
MetadataSet metaDocs = mexClient.GetMetadata();
WsdlImporter importer = new WsdlImporter(metaDocs);
ServiceContractGenerator generator = new ServiceContractGenerator();
generator.NamespaceMappings.Add("*", "NameSpace123");
Collection<ContractDescription> contracts = importer.ImportAllContracts();
ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();
foreach (ContractDescription contract in contracts)
generator.GenerateServiceContractType(contract);
if (generator.Errors.Count != 0)
throw new Exception("There were errors during code compilation.");
CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("C#");
CompilerParameters parameters = new CompilerParameters();
parameters.CompilerOptions = string.Format(@" /lib:{0}", "\"C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\v3.0\"");
parameters.ReferencedAssemblies.Add("System.ServiceModel.dll");
parameters.ReferencedAssemblies.Add("System.Runtime.Serialization.dll");
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.IncludeDebugInformation = true;
parameters.OutputAssembly = "WCFGenerated.dll";
CodeCompileUnit codeUnit = generator.TargetCompileUnit;
CompilerResults results = codeDomProvider.CompileAssemblyFromDom(parameters, codeUnit);
foreach (CompilerError oops in results.Errors)
throw new Exception("Compilation Error Creating Assembly: " + oops.ErrorText);
//Must load it like this otherwise the assembly wont match the one used for the generated code below
return Assembly.LoadFile(Directory.GetCurrentDirectory() + "\\WCFGenerated.dll");
}
Editar: Nunca tuve que esto funcione del todo bien, sin embargo, me las arreglé para cargar el archivo ejecutable como un conjunto y el uso que para generar el proxy:
try
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentUICulture.GetConsoleFallbackUICulture();
if (Console.OutputEncoding.CodePage != Encoding.UTF8.CodePage && Console.OutputEncoding.CodePage != Thread.CurrentThread.CurrentUICulture.TextInfo.OEMCodePage)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
var assembly = Assembly.LoadFile(Path.Combine(info.TempDir, SVCUTIL_EXE));
var optionsType = assembly.GetType("Microsoft.Tools.ServiceModel.SvcUtil.Options");
var runtimeType = assembly.GetType("Microsoft.Tools.ServiceModel.SvcUtil.ToolRuntime");
//Options option = Options.ParseArguments(args);
var options = optionsType.InvokeMember("ParseArguments", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { info.Args });
//ToolRuntime toolRuntime = new ToolRuntime(option);
ConstructorInfo c = runtimeType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { optionsType }, null);
var runtime = c.Invoke(new Object[] { options });
//var runtime = Activator.CreateInstance(runtimeType, , null, options);
//toolRuntime.Run();
var exitCode = (int)runtimeType.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, runtime, null);
if (exitCode != 0)
throw new Exception(String.Format("Failed to generate wcf contract code [Bad Result: {0}]", exitCode));
}
catch (Exception e)
{
if (e is TargetInvocationException)
e = e.InnerException;
info.E = e;
}
¿Cuál es la pregunta aquí? – MrWuf
Editado para agregar la pregunta – Lodle