none
¿Es posible especificar por código, o en el Web.config de un Servicio Web de ASP.NET, la ruta en la que estarán las librerías que el servicio va a utilizar? RRS feed

  • Pregunta

  • Buenas a todos,

    Estoy desarrollando un Web Service para ASP en VB.NET, que sirve como puente entre una web y las librerías de una aplicación de escritorio que he desarrollado con anterioridad. 

    El tema es que necesito prescindir de tener una copia de todas las librerías que tengo que utilizar, en la carpeta bin\ del propio servicio web, donde me gustaría que solo estuviese la .dll resultado de la compilación del propio servicio.

    Puedo invocar por código a una librería "A.dll" en particular pero, como esa librería tiene otras librerías referenciadas, estas sí que son buscadas por mi servicio, en la carpeta bin\, y no donde tengo la "A.dll".

    ¿Podríais decirme si es posible especificar la ruta donde estarán todas las librerías que se van a utilizar?

    Un saludo y muchas gracias


    lunes, 2 de diciembre de 2019 16:22

Todas las respuestas

  • La busqueda de las librerias que hace .Net se llama "fusion", y es bastante compleja. Seguramente encontraras bastante documentacion oficial si la buscas, pero te resumo algunos puntos:

    Un sitio donde puedes ubicar las librerias es el GAC ("Global Assembly Cache"). Lo que este instalado en el GAC lo encuentran todas las aplicaciones, sean Web o sean de escritorio.

    Otro sitio donde se busca es en la carpeta del ejecutable (o el bin si es una aplicacion web). Si esto falla, se busca en una subcarpeta con el mismo nombre de la libreria pero sin extension.

    Otra opcion es editar el .config y agregar una entrada para la DLL indicando CodeBase o Probing. Ver https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/specify-assembly-location  Ojo, segun la version del Framework creo que hay limitaciones en cuanto a cuales son las rutas que se pueden poner aqui. No vale apuntar a cualquier direccion arbitraria en disco.

    Finalmente hay una opcion para resolver por codigo la ubicacion de las librerias. Para ello tienes que implementar el evento AssemblyResolve del AppDomain.CurrentDomain. Cada vez que el sistema necesita una libreria, se dispara ese evento y le llega como argumento el nombre de la libreria y otros datos tales como la version deseada. Entonces el programa puede responder devlviendo un Assembly, que puede cargar de cualquier ubicacion que desee incluso calculada sobre la marcha dependiendo de cual sea la libreria. Este es el metodo mas potente, pero requiere programar el contenido del manejador del evento.

    lunes, 2 de diciembre de 2019 16:59