wix3.0中的平台识别
我在将托管代码从x86平台迁移到x64平台时面临问题。我有一个WiX项目,以创建一个将通过引导程序执行 在x86平台上,文件会按照Project.wxs文件复制到“程序文件”中。但是,如果通过引导程序在x64平台上安装了相同的MSI,则默认情况下会在“程序文件(x86)”中复制所有安装文件,并且应用程序的功能失败,因为它无法在程序文件的12配置单元层次结构中找到所需的文件(对于64位,它是“C:\Program Files\Common Files\Microsoft Shared\web服务器扩展\12\CONFIG”) 我尝试过使用预处理器变量,如,但我需要在项目属性中将此变量硬编码为x86或x64。最后,我为两个不同的平台使用了两个不同的MSI,这对我来说不是一个理想的解决方案wix3.0中的平台识别,wix,cross-platform,wix3,system-identification,Wix,Cross Platform,Wix3,System Identification,我在将托管代码从x86平台迁移到x64平台时面临问题。我有一个WiX项目,以创建一个将通过引导程序执行 在x86平台上,文件会按照Project.wxs文件复制到“程序文件”中。但是,如果通过引导程序在x64平台上安装了相同的MSI,则默认情况下会在“程序文件(x86)”中复制所有安装文件,并且应用程序的功能失败,因为它无法在程序文件的12配置单元层次结构中找到所需的文件(对于64位,它是“C:\Program Files\Common Files\Microsoft Shared\web服务器
因此,通过WiX,是否可以确定平台以确保安装在所需位置?我不相信您将能够拥有一个支持这两个平台的MSI。您需要为x86和另一个x64创建一个MSI-好消息是,您不需要维护另一个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配置单元层次结构时遇到的问题
<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>
所有这些就绪后,就只需在命令行上传递“Platform”预处理器变量的相关值,或在Visual Studio中选择目标平台。您可以使用条件语句(文档)它将检测安装程序在安装时运行的平台。这允许您只创建一个可在所有平台上运行的安装程序 64位平台的测试是
VersionNT64
,而非64位平台的测试则是而不是VersionNT64
例如:
<Component Id="SomeComponentId" Guid="SomeGuid">
<Condition>
<![CDATA[NOT(VersionNT64)]]>
</Condition>
<File Id="SomeFile" Name="Somefile.exe" Source="$(var.UI.TargetDir)\ProjectOutput.exe" />
</Component>
您可以使用
candle -arch x86
或
结果是
Platform=“x64”
和Win64=“true”
将生成属性。谢谢。现在是WIX的另一个问题:通过WIX,当我通过访问64位组件的注册表项获取其安装路径时,由于注册表重定向,它被重定向到WOW6432node,其中注册表项不存在。因此,通过WIX,有没有办法查看仅创建单个MSI的64位注册表视图?据我所知,组件必须标记为Win64=“是”为了使注册表项写入64位注册表配置单元而不是WOW64注册表配置单元。还有其他建议吗?我在回答中提供的解决方案解决了这个问题。@PeterMortensen.Yes.Fixed。在WiX 3中,不鼓励使用平台属性。他们建议不使用它,而使用-arch
改为candle。您可能需要使用sys.BUILDARCH而不是var.Platform.Umm,据我所知,Windows Installer支持使用单个MSI安装32位和64位组件。MSI只能指定单个体系结构,但它可能同时嵌入32位和64位,并且Windows Installer能够安装both只有一个安装程序。考虑到这些组件如何属于相同或不同的功能,不同的设计有很大的空间。参考:
candle -arch x64