2010-03-16 23 views
17

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 dolores de cabeza de soporte y nos gustaría evitar que esto suceda.WiX: Impida que el instalador de 32 bits se ejecute en Windows de 64 bits

Quiero evitar que el instalador MSI de 32 bits se ejecute en máquinas Windows de 64 bits. A tal fin 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 define así:

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

La cosa es que no puedo conseguir este control funcione bien. O dispara todo el tiempo, o nada de tiempo. El objetivo es comprobar la presencia de la variable msix64 en tiempo de ejecución contra la variable Win64 en tiempo de compilación y lanzar un error si no se alinean, pero la lógica no funciona como yo lo intento. ¿Alguien ha encontrado una mejor solución?

Respuesta

15

Incluya el elemento Condición solo en su paquete de 32 bits (es decir, utilizando? If? enunciado preprocesador). La condición sería "NO Msix64": las condiciones de lanzamiento son las que deben ser verdaderas, 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.

+0

Esto terminó haciendo el truco. Mi error fue obtener la lógica hacia atrás para 'Condition'. –

+1

Msix64 requiere Windows Installer 3.1 que no está presente en XP de forma predeterminada (consulte http://msdn.microsoft.com/en-us/library/aa370522(v=VS.85).aspx) –

3

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. Debe hacer referencia a ellos como $(var.MyWixVariable) donde los usa, y el preprocesador de wix los reemplazará con su valor definido.

me gustaría probar este 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, entonces esto va a causar una propiedad "Win64" que se registra en la base de datos de Windows Installer (es decir, la MSI archivo) y la propiedad estará disponible durante la instalación para su uso en un elemento de condición.

+0

Esto genera un error cuando se ejecuta a través de la luz en Wix 3.6 que indica que el elemento de propiedad anidada no se puede colocar con la sintaxis . – Jon

+0

@JonSamwell: Estas instrucciones de procesamiento ('') están destinadas para el preprocesador en candle.exe. Light.exe nunca debería verlos si está usando wix correctamente. –

3

Añadir esta condición

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

Se puede crear un instalador con un componente de 32 bits y un componente de 64 bits y poner estas dos condiciones en los respectivos componentes

<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í es una referencia Solía ​​

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

6

se utiliza la siguiente ...

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

VersionNT64 requiere Windows Installer 4.0 (ver http://msdn.microsoft.com/en-us/library/windows/desktop/aa372497.aspx) –

Cuestiones relacionadas