用于构建 Surface Pro X 的 WiX 工具集中的 ARM64 支持?

ARM64 support in WiX Toolset for building for Surface Pro X?

随着 Microsoft 发布 Surface Pro X,我希望为 ARM 系统创建一个 MSI 安装程序。我一直在四处寻找,似乎 WiX Toolset v3 not 支持 ARM 安装项目。但是,看起来 WiX v4 确实支持 as documented here

我使用安装程序 found here on the offical WiX site. However, despite me having the WiX Toolset Visual Studio 2017 Extension 安装了 WiX 工具集 v4,Visual Studio 2017 仍然没有给我 select WiX 工具集 v4 安装项目的选项。我只有 v3 的选项:

我确实通过 Visual Studio 安装程序验证了我确实安装了 WiX v4 架构:

我知道 v4 选项可以通过其他人的 Visual Studio 设置获得。例如,Nick Nolan 在 Whosebug 上对 this question 的回答链接到一个屏幕截图,您可以在其中看到他在“New Project" 对话框资源管理器。

如何将 WiX Toolset v4 支持添加到 Visual Studio 2017? 换句话说,如何在“[=] 下添加 v4 选项30=]WiX Toolset”在“New Project”资源管理器window中,如图here?

According to Christopher Painter,似乎 WiX v4 实际上已从 Visual Studio 扩展名中删除:

WiX 4.0 is years away to be honest. I wouldn't worry about it at all right now. In fact the WiX v4 templates were recently removed from Votive (Visual Studio Extension) so that should give you an idea how far out it is.

经过进一步调查,Visual Studio 扩展的提交历史证实了这一点。 The commit #886a974 删除 v4 选项。

我会看看是否可以重新启用它,看看是否可以为 ARM 系统创建一个设置 *.MSI


编辑 1 - 2020 年 2 月 24 日

如果您安装了以前版本的 WiX 扩展,您将能够再次访问 v4 选项,而无需重新编译整个扩展。启用 v4 选项的最新版本是 v0.9.28.58839。但是,在安装之前,请确保卸载您可能已安装的任何现有扩展。

安装此 扩展后,您将必须安装 v4 构建工具 located here。唯一剩下要做的就是打开 Visual Studio 并创建一个新的 WiX v4 项目。

现在,我正在玩 WiX v4,尽管 <Package .../> 标签中的 Platform 字段允许值 arm ,它将编译成功。我一直收到以下错误:

ICE39: PID_TEMPLATE value in Summary Information Stream is not valid. It must be of the form "Platform,Platform,...;LangID,LangID,...".

(我确保按照 here 所述将 InstallerVersion 设置为 500。)

我将此归因于 WiX v4 尚未完全实现 ARM 支持,我认为它可能会保持这种状态一段时间。同时,只需将安装程序编译为 x86,因为 Windows 因为 ARM 内置了 x86 仿真。

编辑 2 - 2020 年 5 月 27 日

ARM 支持最终 添加到 WiX v3 工具集

issue #6137 and PR #503. As noted in the issue, you have to install WiX v3.14.0.3910 所述,对 ARM(32 位)和 ARM64(64 位)的支持似乎刚刚添加到 WiX v3 中。如果您有任何打开的 Visual Studio 项目,请确保它们都已关闭。此外,安装 WiX v3.14 后,请务必单击“可用更新”按钮以获取更新的更新。

现在,构建配置仍然不允许您选择 armarm64。您必须手动将平台配置添加到 *.wixproj 文件中。出于某种原因,Surface Pro X 上的“Windows for ARM”如果您为 arm(即 32 位 arm ) 而不会 arm64。因此,这是我添加到 *.wixproj 文件中的 arm64 构建配置:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|arm64' ">
    <DefineConstants>Debug</DefineConstants>
    <OutputPath>bin$(Platform)$(Configuration)\</OutputPath>
    <IntermediateOutputPath>obj$(Platform)$(Configuration)\</IntermediateOutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|arm64' ">
    <OutputPath>bin$(Platform)$(Configuration)\</OutputPath>
    <IntermediateOutputPath>obj$(Platform)$(Configuration)\</IntermediateOutputPath>
</PropertyGroup>

现在,在我结束之前做一些说明。似乎没有 ProgramFilesArm64FolderProgramFilesArmFolder 全局常量像 x64x86 构建(例如 ProgramFiles64FolderProgramFilesFolder 分别)。因此,您必须像这样手动定义它:

<Directory Id="ProgramFilesArm64Folder" Name="Program Files (Arm)">
    <Directory Id="INSTALLFOLDER" Name="!(loc.ProductNameFolder)" />
</Directory>

(其中 !(loc.ProductNameFolder) 是在我的 WiX 本地化文件中定义的语言环境常量,并为我的程序定义了安装文件夹的名称。)

在 Surface Pro X 上,新的 ARM64 程序文件文件夹名为“Program Files (Arm)”。

最后,在您的 <Project /> 定义中,确保将 InstallerVersion 设置为 500Platform 可以保留为 $(var.Platform) 或者您可以手动输入 arm64。对于两个 Platform 输入,智能感知都会在其下划线,但这可以忽略。

完成所有这些之后,您现在应该能够为 Surface Pro X 机器创建 ARM64 MSI 安装程序了!