visual tutorial toolset studio msi how create wix installation windows-installer wix3 platform

toolset - wix msi tutorial



WiX: impide que el instalador de 32 bits se ejecute en Windows de 64 bits (4)

Añadir esta condición

<Condition Message="This is designed for 32bit OS">%PROCESSOR_ARCHITECTURE ~= "x86" AND %PROCESSOR_ARCHITEW6432 &lt;&gt; "amd64"></Condition>

Podría crear un instalador con un componente de 32 bits y un componente de 64 bits y poner estas dos condiciones en los componentes respectivos

<Component Id="bit32Component" Guid="..." Feature="ProductFeature"> <Condition>%PROCESSOR_ARCHITECTURE~="x86" AND %PROCESSOR_ARCHITEW6432&lt;&gt;"amd64"></Condition> </Component> <Component Id="bit64Component" Guid="..." Feature="ProductFeature"> <Condition>%PROCESSOR_ARCHITECTURE~="amd64" OR %PROCESSOR_ARCHITEW6432~="amd64"></Condition> </Component>

Aquí hay una referencia que utilicé.

http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx

Debido a la confusión del usuario, nuestra aplicación requiere instaladores separados para las versiones de Windows de 32 y 64 bits. Si bien el instalador de 32 bits funciona bien en win64, tiene el potencial de crear problemas de soporte y nos gustaría evitar que esto ocurra

Quiero evitar que el instalador MSI de 32 bits se ejecute en máquinas Windows de 64 bits. Para ello tengo la siguiente condición:

<Condition Message="You are attempting to run the 32-bit installer on a 64-bit version of Windows."> <![CDATA[Msix64 AND (NOT Win64)]]> </Condition>

Con el Win64 definido así:

<?if $(var.Platform) = "x64"?> <?define PlatformString = "64-bit"?> <?define Win64 ?> <?else?> <?define PlatformString = "32-bit"?> <?endif?>

La cosa es que no puedo hacer que este cheque funcione bien. O se dispara todo el tiempo, o ninguna de las veces. El objetivo es verificar la presencia de la variable msix64 tiempo de msix64 contra la variable Win64 tiempo de Win64 y lanzar un error si no se alinean, pero la lógica no funciona como lo intento. ¿Alguien ha encontrado una mejor solución?


El elemento de condición funciona con las propiedades del instalador de Windows, que existen durante una instalación.

Sin embargo, está definiendo un Win64 como una variable wix, no como una propiedad del instalador de Windows. Las variables Wix solo existen mientras se crea la configuración. $(var.MyWixVariable) hacer referencia a ellos como $(var.MyWixVariable) donde los use, y el preprocesador wix los reemplazará con su valor definido.

Yo intentaría esto en su lugar:

<?if $(var.Platform) = "x64"?> <?define PlatformString = "64-bit"?> <Property Id="Win64" Value="1" /> <?else?> <?define PlatformString = "32-bit"?> <?endif?>

Si $(var.Platform) tiene el valor correcto cuando se crea la configuración, esto causará que se registre una propiedad "Win64" en la base de datos del instalador de Windows (es decir, el archivo MSI) y la propiedad estará disponible durante la instalación para su uso en un elemento de condición.


Incluya el elemento Condición solo en su paquete de 32 bits (es decir, use la instrucción? If? Preprocesador). La condición sería "NO Msix64": las condiciones de lanzamiento son cosas que deben cumplirse, por lo que si se establece Msix64, la condición de lanzamiento fallará y eso significa que es un sistema operativo x64 y un paquete de 32 bits, y lo correcto es bloquear.


Utilizamos los siguientes ...

<?if $(var.ProcessorArchitecture)=x86 ?> <Condition Message="!(loc.LaunchCondition_Error64)"> <![CDATA[Installed OR Not VersionNT64]]> </Condition> <?endif?>