2009-12-03 16 views
11

Tengo problemas al migrar el código administrado de la plataforma x86 a x64. Tengo un proyecto de WiX para crear un MSI que se ejecutará a través de Bootstrapper.Identificación de plataforma en WiX 3.0

En una plataforma x86, los archivos se copian en "Archivos de programa" según el archivo Project.wxs. Pero si el mismo MSI está instalado en una plataforma x64 a través de Bootstrapper, todos los archivos de instalación se copian por defecto en "Archivos de programa (x86)" y la funcionalidad de la aplicación falló ya que no pudo encontrar los archivos necesarios en la jerarquía de 12 Archivos de programa (para 64 bits es "C: \ Archivos de programa \ Archivos comunes \ Microsoft Shared \ web server extensions \ 12 \ CONFIG").

He intentado usar variables de preprocesador como <? If $ (var.ProcessorArchitecture) = x64?>, Pero necesito codificar esta variable en la propiedad del proyecto en x86 o x64. Finalmente termino con dos MSI diferentes para dos plataformas diferentes, lo que no es una solución deseable para mí.

Entonces, a través de WiX, ¿es posible identificar la plataforma para garantizar la instalación en la ubicación deseada?

Respuesta

17

No creo que pueda tener un solo MSI que admita ambas plataformas. Tendrá que crear uno para x86 y otro x64; la buena noticia es que no necesita mantener otro proyecto de WiX para lograrlo.

La forma en que he hecho esto en el pasado es tener lo siguiente al principio de la definición de su producto.

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <?if $(var.Platform)=x64 ?> 
     <?define msiProductId = "102F7DF4-19A6-4d3d-987F-FF57A2031593" ?> 
     <?define win64Flag = "yes" ?> 
    <?else ?> 
     <?define msiProductId = "8AE46CAF-220F-4B9F-9527-D4A19A27C45B" ?> 
     <?define win64Flag = "no" ?> 
    <?endif ?> 

    <Product Id="$(var.msiProductId)" 
      Name="My Product" 
      Language="1033" 
      Version="1.0.0" 
      Manufacturer="Acme" 
      UpgradeCode="E2575E4A-A62E-4460-B96D-B722C79C8EAA"> 

     <Package InstallerVersion="400" 
       Compressed="yes" 
       InstallPrivileges="elevated" 
       Platform="$(var.Platform)" 
     /> 

     <!-- Rest of product definition goes here --> 

    </Product> 
</Wix> 

Olvidé de dónde recibí el consejo de utilizar un ProductID diferente para cada plataforma.

Creé la variable 'win64Flag' para que otros elementos de WiX funcionen correctamente en los escenarios multiplataforma. A modo de ejemplo, así es como lo usa para hacer que una sola definición de RegistrySearch funcione para ambas plataformas y debería resolver el problema que está teniendo con la ubicación de la jerarquía de 12 hive.

<Property Id="WSE12DIRECTORY"> 
    <RegistrySearch Id="Reg_WSE12DIRECTORY" 
        Type="raw" 
        Root="HKLM" 
        Key="SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0" 
        Name="Location" 
        Win64="$(var.win64Flag)" 
    /> 
</Property> 

Con todo esto en su lugar, entonces es sólo un caso de pasar el valor de la variable relevante pre-procesador de la 'Plataforma' en la línea de comandos Candle, o la selección de la plataforma de destino en Visual Studio.

+3

En WiX 3, se desaconseja el uso del atributo de plataforma.Recomiendan dejarlo fuera y usar el interruptor '-arch' para la vela en su lugar. http://wix.sourceforge.net/manual-wix3/wix_xsd_package.htm – Chris

+0

Puede necesitar usar sys.BUILDARCH en lugar de var.Platform. –

11

Puede usar la declaración de Condición (documentación here) que detectará en qué plataforma se está ejecutando el instalador en el momento de la instalación. Esto le permite crear solo un instalador que funcionará en todas las plataformas.

La prueba para la plataforma de 64 bits es VersionNT64 y, a la inversa, la prueba para las plataformas que no son de 64 bits es NOT VersionNT64.

Por ejemplo:

<Component Id="SomeComponentId" Guid="SomeGuid"> 
    <Condition> 
     <![CDATA[NOT(VersionNT64)]]> 
    </Condition> 
    <File Id="SomeFile" Name="Somefile.exe" Source="$(var.UI.TargetDir)\ProjectOutput.exe" /> 
</Component> 
+2

Gracias. Ahora aquí está el otro problema de WIX: A través de WIX, cuando estoy ir a buscar una ruta de instalación de componentes de 64 bits mediante el acceso a su clave de registro, debido a la redirección del registro que se redirige a WOW6432node donde no existen las claves de registro. Entonces, a través de WIX, ¿hay alguna manera de mirar en la Vista de Registro de 64 bits con solo la creación de MSI único? Hasta donde sé, un componente debe marcarse como Win64 = "yes" para hacer que las entradas de registro se escriban en la sección de registro de 64 bits en lugar de la sección de registro WOW64. ¿Alguna otra sugerencia? – user223572

+0

Este problema se aborda en la solución que ofrecí en mi respuesta. – JamesD

+0

@PeterMortensen. Sí. Fijo. – eh9

2

Puede utilizar

candle -arch x86 

o

candle -arch x64 

y como resultado se generan las Platform="x64" y Win64="true" atributos.