2011-06-06 7 views
6

Tengo un Windows Installer para mi aplicación. El paquete de la aplicación también contiene una clase de instalador donde algunas de las acciones se realizan y otras se realizan en acciones personalizadas.Problemas relacionados con la instalación de una aplicación mediante Windows Installer

El instalador instala otra aplicación desde Acciones personalizadas durante la instalación. Deseo saber si esta aplicación ya existe de la misma versión que no quiero instalar o si debo proporcionar un Messagebox para volver a instalar Y/N.

Si mi aplicación ya está instalada y vuelvo a hacer clic en el mismo instalador, obtengo las opciones "Reparar" y "Eliminar". Pero si el instalador es de nueva construcción, aparece un cuadro de diálogo que dice "Otra versión ya está instalada ... elimine usando Agregar Eliminar programas ...". Por lo tanto, no puedo actualizar la versión existente sin desinstalarla. ¿Cómo puedo actualizar la versión existente?

Cualquier ayuda u orientación para estas 2 consultas son muy apreciadas. Miré en la red para estos pero no pude obtener las respuestas adecuadas. Si puedes ayudarme, eso sería realmente genial.

CÓDIGO

prouct.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
ProductCode="My.Bootstrapper.ABC"> 

<!-- Create Package, Product Manifest http://msdn.microsoft.com/en-us/library/ee335702.aspx 
    Schema Reference : http://msdn.microsoft.com/en-us/library/ms229223.aspx 
    --> 

<PackageFiles> 
    <PackageFile Name="XYZ.exe"/> 
</PackageFiles> 

<InstallChecks> 
    <!-- If its installed, it will be in Uninstall. DisplayName will be XYZ2.1_rc22 
    Can still get values of DisplayVersion (2.1_rc22) & UninstallString from this key 
    --> 
    <RegistryCheck 
     Property="IS_XYZ_INSTALLED" 
     Key="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XYZ" 
     Value="DisplayName"/> 
    </InstallChecks> 

    <Commands> 
    <Command PackageFile="XYZ.exe" Arguments="/Install"> 
    <InstallConditions> 
     <BypassIf Property="IS_XYZ_INSTALLED" 
      Compare="ValueEqualTo" Value="XYZ2.1_rc22"/> // tHIS IS THE DISPLAYNAME, THAT I SEE IN REGISTY 
     <FailIf Property="AdminUser" 
      Compare="ValueNotEqualTo" Value="True" 
      String="NotAnAdmin"/> 
    </InstallConditions> 

    <ExitCodes> 
     <ExitCode Value="0" Result="Success"/> 
     <ExitCode Value="1641" Result="SuccessReboot"/> 
     <ExitCode Value="3010" Result="SuccessReboot"/> 
     <DefaultExitCode Result="Fail" String="GeneralFailure"/> 
    </ExitCodes> 
    </Command> 
</Commands> 

</Product> 

package.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
    Name="DisplayName" Culture="Culture"> 

<!--Check for XYZversion 2.1_rc22 --> 
<Strings> 
    <String Name="DisplayName">Install My XYZ</String> 
    <String Name="Culture">en</String> 
    <String Name="NotAnAdmin">Administrator permissions are required to install XYZ.Contact your 
       administrator.</String> 
    <String Name="GeneralFailure">A general error has occurred while installing this 
      package.</String> 
    </Strings> 
</Package> 

ACTUALIZACIÓN: Quiero instalar XYZ si no está instalado en alerady ORDENADOR PERSONAL. Con el código anterior no se instala como Requisito previo. En Prerrequisito, selecciono mi aplicación (junto con Windows Installer 3.1 & .NET3.5) y seleccioné "Descargar prereq desde la misma ubicación que mi aplicación". En Build of setup project, obtengo 3 carpetas en mi Rel (para winIns, Net & mi aplicación o se instalará como preq, es decir, XYZ). Actualmente, XYZ no está instalado en mi compilación, por lo que no se encontrará la clave. Cuando instalo el instalador, instala la aplicación pero no la aplicación prereq i.e XYZ.exe. ¿Dónde estoy equivocado?

Gracias.

+0

¿Cómo se instala la otra aplicación en la acción personalizada, es otra MSI? – Jodrell

+0

@Jodrell, la otra aplicación es un archivo de instalación de Windows. En Acción personalizada, agregué ese campo en Instalar. Por lo tanto, se ejecuta durante el proceso de instalación y el archivo exe instala la otra aplicación – Tvd

Respuesta

0
  1. Puede comprobar la versión de los archivos ejecutables utilizando GetFileVersionInfo y VerQueryValue funciones WinAPI (debe haber homólogos .Net).

  2. Puede cambiar ProductCode cada vez que se genera el paquete MSI. Las actualizaciones deben incluir la versión actual, es decir, debe permitir las actualizaciones entre la misma versión del paquete, sin cambiar el ProductVersion.

    Sin embargo, yo le recomendaría siguiente Cosmin's recommendation.


actualización: responder a comentar.

<Upgrade Id="Your-Upgrade-GUID"> 
    <UpgradeVersion Minimum="$(var.ProductVersion)" 
        IncludeMinimum="no" 
        OnlyDetect="yes" 
        Language="1033" 
        Property="NEWPRODUCTFOUND" /> 
    <!-- NEWPRODUCTFOUND property is set if a newer product version 
     is installed. It is used to prevent downgrades. --> 

    <UpgradeVersion Minimum="1.0.0" 
        IncludeMinimum="yes" 
        Maximum="$(var.ProductVersion)" 
        IncludeMaximum="yes" 
        Language="1033" 
        Property="UPGRADEFOUND" /> 
    <!-- UPGRADEFOUND property is set if older product version is installed 
     or the same as the value of ProductVersion variable --> 
</Upgrade> 

Utilizamos el código anterior para realizar actualizaciones incluso entre la misma versión de la aplicación. ProductVersion es una variable del preprocesador WiX que contiene la versión actual del producto. PackageCode se genera automáticamente en cada compilación, usando * como su valor en el archivo .wsx.

La clave para hacerlo funcionar es el atributo IncludeMaximum="yes" en el segundo elemento UpgradeVersion y el hecho de que cada paquete generado tiene PackageCode único.

+0

@Alexey, ¿cómo puedo manejar la actualización de mi aplicación? ¿Debo cambiar también el Código del producto o la Versión para la actualización? Y luego, si se trata de una actualización, la ruta de acceso instalada no debería permitir el cambio automático. ¿Cómo conseguir eso en el instalador? También tengo la clase Installer. – Tvd

+0

@Tvd, actualicé la respuesta que proporciona el fragmento de código de WiX que permite actualizar las instalaciones de la versión actual sin actualizar la versión del producto. –

+0

@alexey, gracias. Pero utilizo Windows Installer usando SEtu & Deployment usando VS 2008. Cómo hacer lo mismo con el proyecto de configuración e implementación. Como recomienda la sugerencia de Cosmins, ¿puede echar un vistazo al código y agregar mis comentarios a la respuesta de Cosmin? O cómo manejar lo anterior con el instalador de Windows de Instalación e Implementación MSI. Realmente lo apreciaría – Tvd

3

El instalador instala otra aplicación desde acciones personalizadas durante la instalación de . Quiero saber si esta aplicación ya existe de la misma versión que no quiero instalar o proporcionamos un Messagebox asknig al Reinstalar S/N.

En lugar de una acción personalizada, debe utilizar un requisito previo. Si está utilizando un proyecto de instalación de Visual Studio, quizás esto ayude: Adding Custom prerequsites to visual studio setup project

Si está utilizando otra herramienta de creación de configuración, debe averiguar si es compatible con los requisitos previos o no.

Si mi aplicación ya está instalada y , que haga clic en el mismo instalador de nuevo, me sale "reparación" y "eliminar" opciones. Pero si el instalador es de nueva construcción, aparece un cuadro de diálogo que dice "Otra versión ya está instalada ... elimine usando Agregar Eliminar Programas ...".Por lo tanto, no puedo actualizar la versión existente de sin desinstalar . ¿Cómo puedo actualizar la versión existente ?

Esto sucede porque modificó el paquete sin aumentar la ProductVersion ni modificar el ProductCode. Si desea una actualización automática, debe modificarla.

Sin embargo, si usted está haciendo una prueba y no se desea aumentar el ProductVersion, tiene que desinstalar manualmente el paquete antes de instalar la nueva. Así es como funcionan las actualizaciones de Windows Installer.

+0

@ Cosmin, no puedo entender cómo usar/configurar el archivo de rutina de carga con mi aplicación. Estoy usando Windows Installer. El nombre de mi aplicación es "ABS.exe" y la otra aplicación que estoy instalando es "XYZ.exe", que he creado yo mismo. El sistema puede tener su versión original completa. El nombre del archivo ejecutable de mi aplicación creada es el mismo que el nombre del archivo original de versión completa. Reconozco mi versión integrada al identificar los nombres de archivos y carpetas de la ruta instalada. Con este complejo no puedo entender cómo usar los Prerequsites personalizados. ¿Puedes ayudarme por favor? Creo que estoy perdido en todos los aspectos. – Tvd

+0

@ Cosmin, REG "Otra versión ya está instalada ...". ¿Hay alguna forma de manejar esto? Quiero decir, ¿puedo dar un mensaje personalizado en lugar del mensaje del sistema? ¿Se puede manejar esto, si es así? ¿Cómo manejar esta parte? – Tvd

+0

Supuse que su otra aplicación tiene un instalador diferente. En este caso, puede agregar el segundo instalador como requisito previo. Si está utilizando un solo paquete para ambas aplicaciones, ¿por qué y cómo lo está instalando desde una acción personalizada? Con respecto al mensaje, no puede cambiarlo ni manejarlo. O aumenta la versión y cambia el Código del producto o desinstala manualmente la versión anterior. –

Cuestiones relacionadas