2010-12-09 8 views
6

Mi aplicación utiliza una versión de la biblioteca (a.dll), estoy usando otra DLL (b.dll) que, a su vez, usa una versión anterior de la misma biblioteca (a.dll) que yo uso. Estoy construyendo la aplicación incrustando un archivo de manifiesto. La DLL que uso también está utilizando un archivo de manifiesto incrustado. Tengo ambas versiones de la biblioteca en mi carpeta WinSXS. Mi aplicación no puede cargar las versiones apropiadas de las DLL.¿Se pueden cargar versiones diferentes de DLL en la misma aplicación?

¿Tener un archivo de manifiesto separado (no incrustado en DLL) ayuda a resolver el problema? ¿Cuál es el trabajo?

+0

Use la funcionalidad de creación de perfiles de Dependency Walker para ver qué DLL intenta cargar su aplicación. Esto podría indicarle la causa del problema. – Patrick

Respuesta

6

Su situación es exactamente la que debe resolver WinSxS. Debería estar funcionando.

O bien: Los archivos de manifiesto apuntan a la misma versión, o uno de los archivos de manifiesto que no se encaja correctamente, o

El ensamblado compartido en WinSxS se instaló con una política de configuración que redirige automáticamente las solicitudes de v1. 0 a v1.1


son necesarias algunas aclaraciones: App.exe y B.dll están implícitamente ligados contra A.dll? O lo cargan a través de LoadLibrary.

Si B.DLL carga A.DLL explícitamente usando LoadLibrary, entonces necesita agregar ISOLATION_AWARE_ENABLED a sus definiciones de preprocesador para asegurarse de que las llamadas a LoadLibrary realizadas por B.DLL se vean en el contexto de activación correcto. De lo contrario, se crearán en el contexto del contexto de activación predeterminado que fue creado por el manifiesto del EXE.

+0

No estoy seguro de que WinSxS ayude aquí. WinSxS le permite proporcionar un manifiesto para el exe que garantiza que el proceso carga una versión particular de una DLL. El problema aquí es que diferentes módulos dentro del mismo proceso necesitan diferentes versiones de la misma DLL. AFAIK WinSxS no ofrece ninguna solución para eso, aunque no soy un experto en WinSxS y puede estar equivocado. –

+0

hmmm? App.exe, utiliza un manifiesto para hacer referencia a sharedassembly.1.1 \ a.dll y carga b.dll, que también contiene un manifiesto que hace referencia a sharedassembly.1.0 \ a.dll: este es el escenario del 100% de que el 'aislamiento de la aplicación' era diseñado para apoyar. –

+0

Eso suena como "aislamiento de módulo" en lugar de "aislamiento de aplicación", pero tal vez estoy equivocado. Mi revisión rápida de los documentos me dio la impresión de que WinSxS permite que AppX.exe cargue 1.1 \ a.dll y AppB.exe carguen 1.0 \ a.dll, pero ni una sola aplicación carga varias versiones de la misma DLL (lo que parece una receta) para desastres en general, aunque podría funcionar con algunas DLL). –

0

Dependerá de qué hacen los archivos DLL duplicados y si sus versiones son compatibles. (Por ejemplo, ¿ambos acceden a objetos compartidos en la memoria? De ser así, hay una buena probabilidad de que algo explote).

También dependerá de cómo se carguen esos dos archivos DLL con el mismo nombre. Si es otra cosa que una LoadLibrary explícita con una ruta completa, probablemente las cosas no funcionarán. Hay una discusión en curso sobre esto aquí: Determine the loaded path for DLLs

En general, podría funcionar si tienes suerte. El hecho de que pueda ir catastróficamente mal es una buena razón para evitar el problema por completo, si puede. (En el peor de los casos, podría alojar uno de los módulos en otro proceso y realizar un proxy de todas las llamadas. Idealmente, solo podrá usar la misma versión DLL en ambos módulos).

Cuestiones relacionadas