¿Está bien para programar acción personalizada RemoveExistingProducts antes InstallValidate?

StackOverflow https://stackoverflow.com/questions/2057936

  •  20-09-2019
  •  | 
  •  

Pregunta

Problema

Tengo una MSI que crea e inicia un servicio de Windows durante la instalación y se detiene y elimina el servicio durante la desinstalación. Esto funciona bien cuando la instalación y desinstalación de por sí, pero cuando se actualiza, el Archivos en uso Se visualiza el diálogo (sólo en Vista y más tarde debido a la nueva Administrador de reinicio ), lo que indica que el servicio está en uso.

Fondo

La Archivos en uso de diálogo se muestra durante la InstallExecute secuencia por el InstallValidate acción personalizada, la cual está programada inmediatamente antes de la RemoveExistingProducts acción personalizada; esto significa que la versión anterior no ha sido desinstalado sin embargo, por lo que el Archivos en uso de diálogo debe se muestra.

La documentación de MSDN indica que los RemoveExistingProducts acción deben ser programados después de la InstallValidate acción, y actualmente tengo los RemoveExistingProducts Las acciones programadas inmediatamente después InstallValidate acción.

Solución Potencial

Me gustaría volver a programar los RemoveExistingProducts la acción que inmediatamente antes de la InstallValidate acción personalizada para que la instalación anterior tiene la oportunidad de detener y eliminar el servicio antes de la < strong> archivos en uso de diálogo. Yo probé reprogramación de las acciones, y parece funcionar correctamente sin efectos secundarios adversos (aunque el registro todavía indica que el InstallValidate acción se ejecuta antes de los RemoveExistingProducts de acción), pero estoy reticentes a utilizar esta solución ya que viola la documentación de MSDN, y puede haber efectos adversos que simplemente no estoy viendo todavía.

¿Alguien ha probado esto? La única alternativa que se me ocurre es que la nueva instalación se detiene el servicio de la instalación antigua, pero esto no es deseable, ya que requiere la instalación para tener información acerca de todas las instalaciones antiguas que pueden ser actualizadas (detener este servicio en particular puede implicar más que una simple llamada al Gestor de servicios para detenerlo).

¿Fue útil?

Solución

He implementado la solución potencial formulada en la cuestión, la programación de RemoveExistingProducts inmediatamente antes de InstallValidate . No he visto ningún problema todavía, pero voy a publicar de nuevo después de la instalación se hace más uso.

Actualizar

Nuestra instalación ha estado utilizando esto durante algún tiempo, y no he notado ningún efecto negativo.

Otros consejos

Su sido ya incorporada en el MSI / instalador de Windows ... el único problema es que las clases .NET instalador no se utilizan las características de instalación MSI "servicio". Lo que está sucediendo es que el MSI está tratando de instalar los archivos y ejecutar un comando personalizado utilizando los archivos acaba de copiar (eso es todo Visual Studio está poniendo en el MSI).

Para resolverlo se puede editar el MSI con ORCA y añadir la siguiente línea a la ServiceControl mesa /:

1   ServiceName 170     1   C__489628C5CC1144CB47F43E8BE7F3F31D

El ID de componente se puede buscar en la tabla ARCHIVOS ... acabo de escogió el archivo EXE principal componente de identificación. El 170 es un mapa de bits que indica al instalador de Windows para detener y eliminar el servicio al instalar y desinstalar.

Esto despejará el camino para los instaladores .NET para agregar el servicio y se puede utilizar el ServiceController para iniciar el servicio después de que se ha instalado a través de comandos personalizada.

Un problema potencial sería que si el usuario cancela durante InstallValidate (por ejemplo, debido a no suficiente espacio en disco o un archivo en uso) o durante la instalación, lo que es el comportamiento de reversión. La situación ideal es que el estado de la aplicación es la misma que era antes (por ejemplo, se instala la aplicación anterior). Usted podría estar dando hasta que con su secuenciación, aunque reversión puede ser una característica que se puede vivir sin él.

Creo que éste le ayudará sin violar la documentación de MSDN y evitar cualquier problema futuro. Ponga una condición "instalado o PREVIOUSVERSIONSINSTALLED" y usted estará bien en actualizar también, ya que la propiedad PREVIOUSVERSIONSINSTALLED se establece antes de la acción InstallValidate durante FindRelatedProducts. No sé por qué, pero la propiedad PREVIOUSVERSIONSINSTALLED no está documentado en MSDN pero existe y muy servicial, para mí, sin embargo.

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