c# - studio - ¿Cómo puedo convencer a un msi de VS2005 de que actualice?
poner icono en visual studio 2017 (3)
Tengo un servicio de Windows escrito en C # usando VS2005.
La instalación es a través de un asistente que llama a msiexec para instalar el archivo msi también creado mediante VS2005.
Tengo problemas para generar un archivo msi que actualice de una versión del servicio a otra. El programa asistente maneja la detección de la versión actualmente instalada, detiene el servicio, presenta una línea de comando apropiada para msiexec y luego reinicia el servicio.
El msi existente tiene una propiedad de versión de 1.1.02, la nueva es 1.1.03. Los códigos de producto y actualización son idénticos.
Desinstalar 1.1.02 manualmente a través de agregar / quitar programas funciona bien, al igual que la instalación 1.1.03 en un sistema "limpio".
La actualización 1.1.02 a 1.1.03 se realiza a través de las mociones, pero el resultado final es 1.1.02 instalado.
La línea de comando que el asistente usa para actualizar es:
msiexec / qb / i "MyProduct.msi" REINSTALL = "ALL" REINSTALLMODE = "vos"
¿Dónde estoy equivocado? Asumo que debo haberme perdido algo bastante fundamental ...
La posición alternativa es informar a los clientes que necesitan desinstalar 1.1.02 manualmente antes de ejecutar el asistente para instalar 1.1.03, pero prefiero no tener que hacer eso.
Editado para agregar:
Cambiar el código del producto (como VS2005 también lo solicita) en realidad elimina la posibilidad de actualizar en absoluto, ya que el instalador no le permitirá realizar una reinstalación si ese código de producto no se ha instalado previamente.
Todo lo que le permitirá hacer es instalar (y luego obtendrá el mensaje habitual de "servicio ya existe").
Hay varias cosas que se deben hacer para que las "actualizaciones" funcionen con MSI si desea eliminar automáticamente la versión anterior.
Primero, algunos antecedentes sobre los misteriosos "códigos". Hay 3 códigos (GUID) asociados con un MSI:
- Código de paquete : identifica una versión particular del instalador de MSI y nunca debe reutilizarse en las compilaciones. Siempre debe ser actualizado.
- Código de producto : este identificador se usa para identificar una versión particular de la aplicación. Depende del autor del instalador decidir cuándo asignar un nuevo código de producto.
- Código de actualización : identifica la aplicación y no debe cambiar a lo largo de su vida
El Código de actualización nunca debe cambiar. Para actualizar scenerio, el Código del producto se debe cambiar para cada versión. Además, como mencionó, debe encontrar el número de versión. Puede encontrar el Código del producto y el Código de actualización seleccionando su proyecto de instalación y yendo a la Ventana de Propiedades. El Código del paquete está oculto en Studio y siempre se actualizará.
El elemento que probablemente se está perdiendo, es que también necesita establecer la configuración RemovePreviousVersions en la Ventana de Propiedades en verdadero .
Una cosa más además de la respuesta de Mohlsen (para Visual Studio 2008):
¡Para que su Salida Primaria (su EXE!) Se actualice correctamente, debe incrementar la VERSIÓN DE ARCHIVO
Esta configuración se puede encontrar en Propiedades del proyecto: Pestaña Aplicación -> Información de ensamblaje
Una forma más sencilla de gestionar esto es eliminar el AssemblyFileVersion de todos los ensamblados, incluido el ejecutable principal y todos los archivos DLL administrados.
En cada uno de sus archivos AssemblyInfo.cs, le recomiendo hacer algo como esto si no le importan los números de versión, pero quiere tener cierta trazabilidad.
[assembly: AssemblyVersion("1.1.*")]
// don''t need this [assembly: AssemblyFileVersion("1.0.0.0")]
Todo sigue compilando bien, y si no tiene definido AssemblyFileVersion, el instalador supone que todo es diferente cada vez (lo cual probablemente sea correcto si está instalando todas las DLL al lado del EXE principal).
Pasé mucho tiempo descifrando esto, especialmente si no quiero tener que incrementar nada manualmente.