6

Tengo un servicio de Windows escrito en C# utilizando VS2005.¿Cómo puedo convencer a un msi de VS2005 de que actualice?

La instalación se realiza 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 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 mediante los programas de agregar/quitar 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 los movimientos, pero el resultado final es 1.1.02 instalado.

La línea de comandos que utiliza el asistente para la actualización es:

msiexec/qb/i "MyProduct.msi" REINSTALL = "ALL" REINSTALLMODE = "vos"

dónde voy mal? Asumo que debo haberme perdido algo bastante fundamental ...

La posición alternativa es informar a los clientes que necesitan desinstalar manualmente 1.1.02 antes de ejecutar el asistente para instalar 1.1.03, pero prefiero no tiene que hacer eso.

Editado para añadir:

Cambiar el código del producto (tal como VS2005 también le pide que) en realidad elimina la posibilidad de actualizar en absoluto, ya que el instalador no le permitirá hacer una reinstalación si ese código de producto hasn no se ha instalado previamente.

Todo lo que entonces te dejará hacer es instalar (y entonces obtienes el típico mensaje de "el servicio ya existe").

Respuesta

8

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 (de GUID) asociados con un MSI:

  1. código de paquete - Esto identifica una versión particular del instalador MSI y nunca debe ser reutilizado través construye. Siempre debe ser actualizado.
  2. Código de producto - Este identificador se utiliza 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.
  3. código de actualización - Identifica la aplicación y no debe cambiar a través de su vida útil

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.El código de producto y código de actualización se puede encontrar 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 true.

6

Una cosa más, además de mohlsen de respuesta (Para Visual Studio 2008):

Para que su salida principal (! El archivo EXE) para actualizar correctamente, debe incrementar la versión del archivo

Este ajuste se puede encontrar en Propiedades del proyecto: Pestaña Aplicación -> Información de la asamblea

+0

Sí, tenía esa configuración bien. Al final han renunciado a esto y han recurrido a hacer que el asistente haga la desinstalación seguida de una nueva instalación si detecta una versión anterior en su lugar. Parece que funciona bien y permite que los usuarios finales se actualicen sin tener que manipular manualmente nada. –

+0

Además, por lo que puedo ver, las MSI creadas por Visual Studio son aparentemente notorias por no permitirle actualizar los servicios de todos modos, así que al hacer el trabajo en el asistente, parece que evité caer en la siguiente trampa. –

+0

+1 pero para que quede completamente claro, esto significa actualizar la versión de archivo del proyecto MAIN (¡no el proyecto de instalación!). –

2

Una forma más sencilla de gestionar esto es ELIMINAR AssemblyFileVersion de todos los ensamblajes, incluido el archivo ejecutable principal y todas las DLL administradas.

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 algo de trazabilidad.

[assembly: AssemblyVersion("1.1.*")] 
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")] 

Todavía todo compila bien, y si no tenemos la AssemblyFileVersion definido, entonces el instalador asume que todo es diferente cada vez (que es probablemente muy bien si va a instalar todos los archivos DLL junto a la principal EXE).

Pasé mucho tiempo descifrando esto, ¡especialmente si no quiero tener que incrementar nada manualmente!

Cuestiones relacionadas