Pregunta

Tengo problemas para desinstalar un ensamblado compartido win32 SxS usando Wix3 en WinXP. Mi archivo wix se parece mucho al descrito en http://n2.nabble.com/Tutorial-How-to-install-files-into-WinSxS-td841475.html .

El problema es que, si un módulo del ensamblaje está en uso, el desinstalador se completa con un código de error exitoso pero deja el ensamblaje en un estado roto: el catálogo de manifiesto y de seguridad se ha eliminado, pero el directorio del ensamblado aún existe con mi dlls en el mismo. Las DLL sobreviven a los reinicios, por lo que no están marcadas para su eliminación de ninguna manera. No hay errores obvios en el archivo de registro de MSI.

Si intento reinstalar el paquete, se omite la instalación del ensamblaje. Los componentes ya no están registrados, por lo que no puedo hacer que el instalador intente desinstalar nuevamente. Lo siguiente se muestra en el registro de msi en instalaciones posteriores:

  

MSI (c) (98:44) [11: 46: 56: 263]: omitiendo la instalación del componente de ensamblaje: {26A273E7-7F9A-4F77-9FA8-5E413A155BEC} ya que el ensamblaje ya existe

No puedo encontrar una manera de devolver el SxS a un buen estado, excepto eliminar manualmente el directorio de mi ensamblado, que en este punto ya no está protegido por la Restauración del sistema XP.

Si bien mi instalador real es mucho más complicado, he podido reproducir esto con un instalador muy básico que tiene una sola función que contiene un solo componente. Ese componente contiene un dll, un manifiesto y un catálogo de seguridad. Los dlls & Lt; Archivo & Gt; El elemento tiene establecidos los atributos KeyPath, Assembly y AssemblyManifest. Una vez instalado, puedo simular un proceso que carga el ensamblaje abriendo la DLL en MSVS.

¿Hay alguna acción adicional que debería invocar en la desinstalación para detectar y prevenir esta situación? Alternativamente, ¿hay alguna forma de obligar a que se realice la operación de instalación a pesar de que las DLL ya existen en WinSXS?

Algo relacionado, también tengo un problema si intento actualizar el paquete que instaló el ensamblaje si el ensamblaje no está cambiando. El instalador decide que no necesita reinstalar el ensamblado (ya que no ha cambiado), pero luego, cuando se ejecuta SxsUninstallCA, se ejecuta y elimina el ensamblaje. Desde el punto de vista del instalador, el componente todavía está instalado, pero los archivos se han ido.

¿Fue útil?

Solución

Estoy trabajando en algo que creo que tendré este mismo problema.

Mi suposición en este punto es que yo & # 8217; tendría que resolver esto con un pequeño mojo de la tecla HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations, y posiblemente un poco de permiso de archivo (si los archivos todavía estaban bloqueados).

Que, por supuesto, requiere un reinicio.

Por supuesto, en su instalador, puede verificar la presencia de las claves y bloquearlas durante la instalación hasta que desaparezcan. (es decir, " necesita reiniciar ").

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top