2009-12-03 53 views
11

我在将托管代码从x86迁移到x64平台时遇到了问题。我有一个WiX项目来创建一个MSI这将通过引导程序执行。WiX 3.0中的平台识别

在x86平台上,文件在“程序文件”被复制为每Project.wxs文件。但是,如果通过Bootstrapper在x64平台上安装了相同的MSI,则所有安装文件都会在“Program Files(x86)”中默认复制,并且应用程序功能失败,因为它无法在12-hive层次结构中找到必需的文件程序文件(对于64位,它是“C:\ Program Files \ Common Files \ Microsoft Shared \ web server extensions \ 12 \ CONFIG”)。我试过使用像<这样的预处理器变量?if $(var.ProcessorArchitecture)= x64?>,但是我需要将项目属性中的这个变量硬编码为x86或x64。最后,我结束了针对两个不同平台的两个不同的MSI,这对我来说不是一个理想的解决方案。

因此,通过WiX,是否可以确定平台以确保在所需位置安装?

回答

17

我不相信你将能够拥有一个支持这两种平台的MSI。您需要为x86和另一个x64创建一个 - 好消息是您不需要维护另一个WiX项目来实现此目的。

我过去的做法是在产品定义的开始处有以下几点。

<?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> 

我忘了我在哪里得到了针对每个平台使用不同ProductID的建议。

我创作的“win64Flag”变量获得其他的WiX元素在跨平台的情况下很好地工作。作为一个例子,下面介绍如何使用它来使一个RegistrySearch定义适用于这两个平台,并且应该解决您在查找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> 

带着所有这些地方,那么它只是路过相关值的“平台”预处理器变量上Candle命令行,或选择在Visual Studio目标平台的情况。

+3

在WiX 3中,不鼓励使用平台属性。他们建议不要使用'-arch'开关来代替蜡烛。 http://wix.sourceforge.net/manual-wix3/wix_xsd_package.htm – Chris 2013-01-04 15:50:38

+0

您可能需要使用sys.BUILDARCH,而不是var.Platform。 – 2014-03-12 18:53:40

11

可以使用条件语句(文档here),这将检测安装在其上运行在安装时的平台。这使您可以创建一个适用于所有平台的安装程序。

对于64位平台的测试是VersionNT64,相反,对于非64位平台的测试是NOT VersionNT64

例如:

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

谢谢。现在这里是WIX的另一个问题: 通过WIX,当我通过访问其注册表项来获取64位组件的安装路径时,由于注册表重定向,它被重定向到WOW6432node,其中注册表项不存在。因此,通过WIX,是否有任何方法只通过单一MSI创建来查看64位注册表视图? 据我所知,组件必须标记为Win64 =“yes”,以便使注册表项在64位注册表配置单元而不是WOW64注册表配置单元下编写。 其他建议? – user223572 2010-01-13 09:15:37

+0

我的答案中提供的解决方案解决了此问题。 – JamesD 2010-05-17 01:02:27

+0

@PeterMortensen。是。固定。 – eh9 2013-05-15 14:34:58

2

可以使用

candle -arch x86 

candle -arch x64 

并作为产生的Platform="x64"Win64="true"属性将被生成。

相关问题