Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wix3.0中的平台识别_Wix_Cross Platform_Wix3_System Identification - Fatal编程技术网

wix3.0中的平台识别

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服务器

我在将托管代码从x86平台迁移到x64平台时面临问题。我有一个WiX项目,以创建一个将通过引导程序执行

在x86平台上,文件会按照Project.wxs文件复制到“程序文件”中。但是,如果通过引导程序在x64平台上安装了相同的MSI,则默认情况下会在“程序文件(x86)”中复制所有安装文件,并且应用程序的功能失败,因为它无法在程序文件的12配置单元层次结构中找到所需的文件(对于64位,它是“C:\Program Files\Common Files\Microsoft Shared\web服务器扩展\12\CONFIG”)

我尝试过使用预处理器变量,如,但我需要在项目属性中将此变量硬编码为x86或x64。最后,我为两个不同的平台使用了两个不同的MSI,这对我来说不是一个理想的解决方案


因此,通过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