visual usar una studio net mvc libreria importar hacer crear clases clase biblioteca asp c# app-config service-reference

una - usar biblioteca de clases c#



Incluyendo una referencia de servicio de una biblioteca de clase (5)

Tengo una biblioteca de clase C # y un proyecto de inicio (una aplicación de consola). La biblioteca de clases incluye una referencia de servicio a un servicio web. Cuando trato de ejecutar el proyecto, obtengo una InvalidOperationException porque el proyecto de inicio no está leyendo el archivo app.config de la biblioteca de la clase, y está ignorando la referencia del servicio. Para que funcione, me veo obligado a agregar la misma referencia de servicio al proyecto de inicio. ¿Hay alguna manera de evitar esto? ¿Puedo hacer que el proyecto de inicio reconozca la referencia de servicio de la biblioteca de clase y app.config sin tener que copiarlo al proyecto de inicio?

Intenté agregar un enlace a la aplicación.config de la biblioteca de la clase, pero eso no funciona. La biblioteca de clases no es muy portátil si requiere que alguien lo use para agregar esa referencia de servicio al proyecto de inicio.


Creo que es más confuso si tuviera varios archivos de configuración corriendo.

Si una biblioteca tiene elementos configurables, esperaría tener que poner esa configuración en mi archivo de configuración para consumir correctamente la biblioteca.


Piensa en lo que intentas hacer: tienes dos asambleas que estás construyendo:

Library ConsoleApp

Ambos ensamblajes tienen archivos de configuración; me imagino que se ven más o menos así:

Library app.config ConsoleApp ConsoleApp.exe.config

Cuando ejecuta ConsoleApp no tiene forma de leer o conocer a fondo la app.config de su conjunto de la Library . El único archivo de configuración que conoce o se preocupa es ConsoleApp.exe.config . Ahora es posible hacer que los archivos de configuración se refieran entre sí, pero esta no es la solución adecuada para lo que estás tratando de hacer.

Dado que su conjunto de Library no tiene punto de entrada, nunca se cargará en un dominio de aplicación. Como nunca se cargará en un AppDomain, su archivo de configuración de la aplicación nunca se usará.

Lo que debe hacer es hacer referencia a Library en ConsoleApp través de una referencia de proyecto. A continuación, mueva todos los datos de configuración relevantes de app.config a ConsoleApp.exe.config ya que este es el archivo de configuración que utilizará su aplicación.

Esto le permitirá tener dos cosas que necesita para invocar métodos en su servicio web

  1. El código en la Library que puede enviar y recibir mensajes SOAP.
  2. Los metadatos de configuración que requiere la Library para funcionar.

Puede copiar las partes relevantes de la aplicación.config de la configuración de la biblioteca de la clase en la aplicación.config para la aplicación de la consola.

Alternativamente, si realmente está tratando de hacer que esto sea verdaderamente portátil, deberá pensar en otra forma de referenciar la dirección de la referencia de servicio específica dentro de la biblioteca de la clase.


Solo tiene que copiar la clave de configuración, apuntando al servicio, desde el archivo de configuración de la biblioteca de la clase hasta el archivo de configuración de la aplicación de la consola.


Una alternativa para usar una referencia de servicio en la biblioteca de clase y luego copiar la configuración sería usar eventos de compilación que invoquen a svcutil.exe. Lo que me gusta de esto es que no tiene que hacer "actualizar el servicio de referencia" cuando cambia el servicio. Se actualizará automáticamente.

En la biblioteca de la clase, use un evento de compilación que solo genere el código proxy:

svcutil.exe net.tcp://localhost:3315/MyService/mex /noConfig

En la aplicación, use un evento de compilación que genere la configuración. Puede usar la opción / mergeConfig para fusionarla en una app.config existente.

svcutil.exe net.tcp://localhost:3315/MyService/mex /config:App.config /mergeConfig

Si no desea obtener un error de compilación si el servicio no se está ejecutando, colóquelo en su archivo de proyecto y recibirá una advertencia en lugar de un error:

<Target Name="PreBuildEvent" Condition="''$(PreBuildEvent)''!=''''" DependsOnTargets="$(PreBuildEventDependsOn)"> <Exec WorkingDirectory="$(OutDir)" Command="$(PreBuildEvent)" ContinueOnError="true" /> </Target>