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
- El código en la
Library
que puede enviar y recibir mensajes SOAP. - 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>