No especifica si su entorno es .NET o Win32 directo.
Supongo que es Win32 porque si su .NET las tecnologías para hacer esto están mucho más cerca en términos de cosas como Global Assembly Cache.
En términos de Win32 es posible cargar Dlls desde una ubicación compartida en una de dos maneras:
Uso LoadLibrary con rutas completas explícitos. Esto significa que no puede usar enlaces estáticos: todas las funciones dll utilizadas en todos los productos deberán accederse a través de GetProcAddress. No puede importar clases de C++ desde dll's cargadas a través de LoadLibrary; deben estar vinculadas estáticamente para funcionar, por lo que este enfoque puede o no ser viable. No es muy difícil escribir archivos de encabezado shim que se enmascaran como la interfaz del dll y hacer una carga justo a tiempo y GetProcAddress según sea necesario para cada llamada.
La otra opción es convertir los dll en lo que se denominan "ensambles uno al lado del otro" e instalarlos en la tienda WinSxS. No tengas miedo por el gran nombre. "conjunto lado a lado" significa "Un archivo Dll más archivo de manifiesto con información de versión". Cada una de las diversas aplicaciones pondría 'nombre seguro', que incluye información de la versión, en su manifiesto de aplicación para cada dll que use, y el cargador Dll Win32 usará esto para elegir la instancia correcta del dll común de la tienda WinSxS . El proceso básico se describe en el artículo de MSDN Guidelines for Creating Side-by-side Assemblies
En las versiones de Windows 6.1 y arriba (Windows Server 2008 y los 7 Windows irónicamente llamada) archivos de configuración de aplicaciones hacer ahora soportan el elemento de sondeo en Application Configuration Files
Esto significa que debe poder proporcionar una ruta de acceso (en relación con su aplicación) a una carpeta que contiene los ensamblados dll que desea cargar.
Ok, he hecho algunas pruebas en Windows 7, y esto funciona:
Asumiendo que tiene un APP1.EXE aplicación instalada en \ Archivos de programa \ App1, que depende de alguna thedll DLL común". DLL"
En la carpeta de aplicación (\ archivos de programa \ App1) crear un archivo App1.exe.config y darle el siguiente contenido: -
<configuration>
<windows>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="..\AcmeCommon"/>
</assemblyBinding>
</windows>
</configuration>
Ahora, cree una carpeta llamada \ Program F iles \ AcmeCommon, y en él una carpeta acme.thedll, y copie thedll.dll en \ Program Files \ AcmeCommon \ acme.thedll
Cree también un archivo en AcmeCommon \ acme.thedll llamado acme.thedll.manifest - this será el manifiesto de ensamblado que describe el montaje llamado 'acme.thedll'
el contenido de acme.thedll.manifest habrá: -
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="acme.thedll" version="1.2.3.4" processorArchitecture="x86" type="win32"/>
<file name="thedll.dll"/>
</assembly>
Ahora tenemos la DLL común, en un lugar común, una asamblea sxs nativa. Tenemos la aplicación, con un archivo de configuración que, en el servidor de Windows 7 y 2008 (y superior) le indicará que busque ensambles en la ubicación común. Pero la aplicación todavía está tratando de vincular a la DLL como dll, en lugar de a través de un ensamblado.
Para que la aplicación cargue el ensamblaje, debemos agregar un archivo de manifiesto a la aplicación. Si está utilizando Visual Studio, sus aplicaciones probablemente ya estén configuradas para crear e incrustar manifiestos a través del enlazador y la configuración del proyecto de herramienta de manifiesto.En cuyo caso la forma más fácil de decir la aplicación de la asamblea es para reconstruirlo después de añadir el siguiente código a por lo menos un archivo de cabecera o C/CPP en el proyecto: -
#pragma comment(linker,"/manifestdependency:\"type='win32' name='acme.thedll' version='1.2.3.4' processorArchitecture='x86' language='*'\"")
Si está utilizando una más antigua construir entorno donde los manifiestos son hechas a mano que se necesita para fusionar el siguiente código XML con app1.exe.manifest en la carpeta App1:
<dependency>
<dependentassembly>
<assemblyidentity type="win32" name="acme.thedll" version="1.2.3.4" processorArchitecture="x86" language="*"/>
</dependentassembly>
</dependency>
Esto debería cerrar el círculo: Cuando la aplicación carga el cargador de Win32 cargará el manifiesto de aplicación (app1.exe.manifest o incrustado como un recurso RT_MANIFEST) y aprenda sobre el ensamblado "acme.thedll". También cargará el archivo de configuración de la aplicación (app1.exe.config) y conocerá la ruta privada para buscar ensamblajes. Y luego cargará y agregará "acme.thedll.manifest" al "contexto de activación" de las aplicaciones. Luego, cuando el cargador intente cargar "thedll.dll" buscará el contexto de activación db, encontrará que está en el ensamblado acme.thedll y lo cargará desde la ubicación de los ensamblajes.
Gracias por su respuesta. Lamentablemente, estoy buscando una aplicación C/C++ que no utilice ningún método de vinculación dinámica en tiempo de ejecución (como Loadlibrary (..)) por ejemplo. ¿Hay alguna forma de instruir a través de manifiestos como funciona el concepto de "sondeo"? – Kartlee
@Kartlee, lo siento, no sé sobre C/C++; pero he editado su pregunta para reflejar las palabras clave –