WIX: el registro COM falla al instalar COM dll en otra carpeta

Estoy usando calor para recolectar los archivos COM dll y tlb (llamémoslos MyLib.*, desarrollados en VB.NET) para hacer el registro COM. Todo funcionaba bien cuando instalé MyLib.dll y MyLib.tlb en la carpeta de instalación de mi aplicación, es decir, INSTALLDIR. Sin embargo, dado que queremos permitir que se instalen diferentes versiones de nuestro SW en la misma máquina, y si están usando la misma versión del componente COM, solo una copia del dll (creo que cada versión de nuestro SW debería tener su propio tlb, corríjame si me equivoco), ahora queremos instalar MyLib.dll en otra carpeta, específicamente PROGRAM_FILES\Common Files\SHARED_FOLDER_NAME, por lo que ahora, si se desinstala una versión de nuestro SW, MyLib.dll no se puede eliminar y aún puede ser utilizado por otras versiones.

Pero aquí viene el problema: mi registro COM simplemente ya no funciona después de instalar este dll en esta otra carpeta, y sigue diciendo que no puedo encontrar el archivo especificado cuando llamo a la función COM, lo que indica una falla en el registro. En el proyecto de instalación de WIX, todo es igual excepto esta carpeta para MyLib.dll.

Aquí está la estructura del registro después de la instalación:

En primer lugar, tengo HKCR\CLSID{MYCLSIDs}, cada uno de ellos representa uno de mi clase COM. en la subclave denominada "InprocServer32", tengo Assembly, Class, CodeBase, RuntimeVersion, threadingModel. Y CodeBase es una carpeta de archivos común (no funciona) o la carpeta de instalación de MyApp (funciona), que son las diferentes ubicaciones en las que coloco el dll. Pensé que habría otra subclave TypeLib en {MYCLSIDs}, ya que Access solo ve TypeLib y creo que debería haber algún enlace desde TypeLib a la dll real, sin embargo, en ambos casos esta subclave falta pero en el segundo caso sigue funcionando. ¿Hay un problema de eso?

En segundo lugar, tengo HKLM\Software\Classes\CLSID{MYCLSIDs}, estas claves tienen, por supuesto, la misma estructura descrita anteriormente.

En tercer lugar, los HKCR{MYPROGIDs}, estos son solo ProgID de mis clases

En cuarto lugar, HKCR\Typelib{LibID}, que incluye la información del archivo tlb, y este ID es del GUID de ensamblado del proyecto del componente COM.

Finalmente, HKEY_CLASSES_ROOT\Interface{InterfaceID}, hay subclaves llamadas ProxyStubClsid32 con valor {00020424-0000-0000-C000-000000000046}, y la llamada TypeLib y el valor es mi LibID.

Como mencioné, la única diferencia es CodeBase, que almacena donde se encuentra MyLib.dll. Para verificar eso, hice dos pruebas: después de instalar MyLib.dll en la carpeta compartida, la llamada COM falla. Pero si reemplazo todos los valores de CodeBase para SHARED_FOLDER\MyLib.dll a INSTALLDIR\MyLib.dll y copio MyLib.dll en INSTALLDIR, realmente funciona. Vise versa, después de instalar MyLib.dll en INSTALLDIR (en cuyo caso COM está funcionando), cambio los valores de CodeBase de INSTALLDIR\MyLib.dll a SHARED_FOLDER\MyLib.dll y hago una copia a SHARED_FOLDER, esta vez falla. Entonces parece que es exactamente el problema de la ubicación de la instalación, que es lo opuesto a mi comprensión de COM. Y no creo que haya un problema de permisos para SHARED_FOLDER (podría estar equivocado) ya que está en una carpeta que crea mi instalador.

Por favor ayuda, gracias!

preguntado el 27 de julio de 12 a las 14:07

1 Respuestas

Resultó que MyLib.dll está usando algunas otras bibliotecas, que todavía están instaladas en la carpeta de instalación de MyApp. Entonces, en ese caso, MyLib.dll está instalado en la carpeta compartida, intenta encontrar esas bibliotecas en las mismas bibliotecas, lo que por supuesto falla. Cuando instalo esas bibliotecas en la carpeta compartida también, funciona.

Por cierto, encontré fulogvw.exe muy útil al rastrear el problema de carga del ensamblaje. Por ejemplo, en mi caso, en el registro fallido dice que no se puede cargar el archivo xxx.dll en SHARED_FOLDER, xxx.dll es una biblioteca que está usando MyLib.dll, y no tenía idea de que MyLib.dll lo necesita hasta que veo el registro.

Respondido 30 Jul 12, 13:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.