将托管代码从x86迁移到x64平台时,我遇到了问题。我有一个WiX项目来创建一个MSI,它将通过Bootstrapper执行。
在x86平台上,文件将根据Project.wxs文件复制到“Program Files”中。但是如果通过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?&gt ;,但是我需要将project属性中的这个变量硬编码为x86或x64。最后,我最终为两个不同的平台提供了两个不同的MSI,这对我来说不是一个理想的解决方案。
因此,通过WiX,是否可以识别平台以确保在所需位置安装?
答案 0 :(得分: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命令行上传递'Platform'预处理器变量的相关值,或在Visual Studio中选择目标平台。 / p>
答案 1 :(得分:11)
您可以使用Condition语句(文档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 :(得分:2)
您可以使用
candle -arch x86
或
candle -arch x64
结果将生成Platform="x64"
和Win64="true"
属性。