向 Windows 应用添加 Arm 支持

基于 Arm 的设备因其节能特性、更长的电池使用时间和令人印象深刻的处理能力而变得越来越受欢迎,此外,基于 Arm 的 Windows 对神经网络处理单元 (NPU) 的支持针对日益流行的 AI 和机器学习工作负载进行了优化。

本指南介绍为由 Arm64 处理器提供支持的设备添加对 Windows 应用的支持的步骤。 指南还涵盖解决可能干扰创建基于 Arm64 的应用版本的任何潜在问题或障碍(例如第 3 方依赖项或插件)的方法。

在基于 Arm 的设备上进行 x86 或 x64 Windows 应用仿真

Arm 版本的 Windows 10 包含仿真技术,使未经修改的现有 x86 应用能够在 Arm 设备上运行。 Windows 11 扩展了该仿真技术,以便在由 Arm 提供支持的设备上运行未经修改的 x64 Windows 应用。

在 Arm 设备上仿真 x64 和 x86 的能力是向前迈出的重要一步,而本指南可帮助添加 Arm 本机支持,以便你的应用利用本机性能提升和由 Arm64 提供支持的设备带来的独特优势,包括:

  • 优化应用的功耗以延长设备的电池使用时间。
  • 优化 CPU、GPU 和 NPU 的性能以加速工作流,特别是在使用 AI 时。

此外,需要将内核驱动程序生成为本机 Arm64。 内核中不存在仿真。 这主要影响虚拟化方案。 对于所用设备驱动程序需要直接访问在内核模式(而非用户模式)下运行的操作系统或硬件内部,且尚未更新为支持 Arm64 处理器的应用,请参阅使用 WDK 生成 Arm64 驱动程序

注意

渐进式 Web 应用 (PWA) 已经以本机 Arm64 性能执行。

先决条件

如果要使用基于 Arm 的设备更新应用(本机编译 - 为运行的同一平台生成代码),可以使用:

  • 介绍 Visual Studio 17.10 –预览版 1(2024 年 2 月)

  • Visual Studio 2022 v17.4 或更高版本。 这是 Visual Studio 的第一个正式发布版本,它以本机方式支持在基于 Arm 的处理器上生成和调试 Arm64 应用。 与以前的仿真版本相比,Visual Studio 2022 17.4 和 Microsoft Visual C++ (MSVC) 本机 Arm64 版本都提供了明显更好的性能。

  • (可选)LLVM (Clang) v12+ 或更高版本。 LLVM 12 添加了在基于 Arm64 的 Windows 上托管的官方二进制版本,包括 Clang 编译器、LLD 链接器和 compiler-rt 运行时库。

如果要更新 Windows 应用以支持 Arm 使用基于 Intel 的 x64 或 x86 设备(交叉编译),可以使用:

在交叉编译或本机编译之间进行选择时需要考虑几个因素,例如可用的硬件和测试执行的简单性。

注意

GCC(GNU 编译器集合)支持将在不久的将来推出。

添加 Arm64 本机支持的步骤

将应用更新为在 Arm64 上本机运行:

  1. 在 Visual Studio 中向项目添加 Arm64 配置
  2. 测试和调试新生成的 Arm64 应用
  3. 在 Arm 设备上生成和测试应用

确认应用已成功针对 Arm 设备进行优化后:

  1. 更新安装程序并发布更新后的应用
  2. 规划持续更新

步骤 1 - 在 Visual Studio 中向项目添加 Arm64 配置

将具有调试和发布目标的新 ARM64 解决方案平台添加到现有 x64 或 x86 应用项目:

  1. 在 Visual Studio 中打开你的解决方案(项目代码)(有关受支持的版本,请参阅先决条件)。
  2. 在“标准”工具栏上的“解决方案平台”下拉菜单中(或在“生成”菜单中),选择“配置管理器...”
  3. 打开“活动解决方案平台”下拉菜单,然后选择“<新建...>”
  4. 在“键入或选择新平台”下拉菜单中,选择“ARM64”,并确保将“从其中复制设置”值设置为“x64”,启用“创建新项目平台”复选框,然后选择“确定”

祝贺你! 你已开始向应用添加 Arm 支持。 接下来,检查是否已成功生成 Arm64 解决方案。

如果未成功生成解决方案,则需要解决导致生成失败的问题。 最可能的原因是依赖项不适用于 ARM64,下面的故障排除中对此进行了介绍。

(可选):如果想直接验证你的应用二进制文件现在是否是针对 Arm64 生成的,可以在 PowerShell 中打开项目目录(在 Visual Studio 解决方案资源管理器中右键单击应用项目,然后选择“在终端中打开”)。 更改目录,以便选择项目的新 bin\ARM64\Debug 或发布目录。 输入命令:dumpbin /headers .\<appname>.exe(将 <appname> 替换为应用的名称)。 在终端的输出结果中向上滚动,找到 FILE HEADER VALUES 部分并确认第一行为 AA64 machine (ARM64)

步骤 2 - 测试和调试新生成的 Arm64 应用

在 Visual Studio 中向项目添加 Arm64 解决方案平台后,检查是否已成功生成 Arm64 解决方案:

  1. 关闭“活动解决方案平台”窗口。
  2. 将生成设置从“调试”更改为“发布”
  3. 在“生成”下拉菜单中,选择“重新生成解决方案”并等待项目重新生成
  4. 你会收到输出“重新生成全部成功”。 如果没有,请参阅下面的故障排除部分。

为应用生成二进制文件以支持 Arm64 后,建议对其进行测试。 这将要求设备或虚拟机在基于 Arm 的 Windows 上运行。

如果在基于 Arm 的 Windows 设备上进行开发,则可以使用 Visual Studio 本地调试轻松进行设置。 如果进行交叉编译(使用未在 Arm 处理器上运行的设备),则将需要在基于 Arm 的 Windows 设备或虚拟机上使用远程调试,以便在另一台设备上运行 Arm64 应用时在 Visual Studio 中获得开发体验。

可用于测试的基于 Arm 的 Windows 硬件或虚拟机

如果你正在寻找用于持续集成 (CI) 和测试的硬件,以下是一些配备基于 Arm64 的处理器的 Windows 设备:

有关如何设置运行基于 ARM 的 Windows 的虚拟机 (VM) 以支持 CI 和测试的帮助,请参阅快速入门:在 Azure 门户中创建基于 ARM 的 Windows 虚拟机

步骤 3 - 在 Arm 设备上生成并测试你的应用

添加测试自动化通行证是持续集成和持续交付 (CI/CD) 策略的重要考虑因素。 对于在 Windows 上运行的 Arm64 解决方案,请务必在 Arm64 体系结构上运行测试套件,这可以是使用上面列出的 Arm 设备之一的基于 Arm 的 Windows 实际硬件,也可以是上面列出的 VM 中的虚拟机。

在与测试相同的计算机上编译应用程序更方便,但在许多情况下不需要这样做。 而是可以考虑扩展现有的生成基础结构来生成 Arm64 的交叉编译输出。

步骤 4 - 更新安装程序并发布更新后的应用

如果应用已发布到 Microsoft Store,则按照上述步骤生成 Arm64 版应用后,可以通过访问合作伙伴中心仪表板并向提交添加新生成的 ARM64 二进制文件来更新 Microsoft Store 中的现有应用包。

如果你的应用尚未在 Microsoft Store 中发布,则可以按照说明根据是要提交 MSI、EXE、MSIX 包、PWA 还是应用加载项来创建应用提交

如果生成自己的安装程序,则应确保它能够成功安装新的 Arm64 版本。 大多数安装程序框架(例如 WiXSquirrelInnoSetupInstallAware 等)都支持基于 Arm 的 Windows,不会出现问题。

如果在网页中提供应用的安装程序,则可以使用用户代理客户端提示来检测客户何时从基于 Arm 的 Windows 设备进行访问,并向其提供更新后的 Arm 本机版应用。 与用户代理字符串不同,用户代理客户端提示支持区分 Arm 客户和 x86 设备客户。

步骤 5 - 规划持续更新

现在你已经发布了 Arm64 版应用,接下来需要确保它像其他版本的应用一样保持更新。 最好使版本和功能跨体系结构保持一致,以避免客户将来感到困惑。

疑难解答

可能干扰或阻止你添加现有 x64 或 x86 Windows 应用的 Arm64 版本的常见问题包括:

未针对 ARM64 编译的依赖项会阻止成功生成

如果由于依赖项(无论是内部依赖项、第三方依赖项还是开源库依赖项)而无法生成,需要找到一种方法来更新该依赖项以使其支持 ARM64 体系结构,或将其移除。

  • 对于内部依赖项,建议重新生成依赖项以支持 ARM64。

  • 对于第 3 方依赖项,建议提交请求,让维护人员重新生成支持 ARM64 的依赖项。

  • 对于开源依赖项,请考虑查看 vcpkg,以查看是否存在包含 ARM64 支持的较新版本的依赖项,以更新到该版本。 如果不存在更新,请考虑自行向包添加 ARM64 支持。 许多开源维护者都会感谢这一贡献。

  • Linaro 组织还与企业和开源社区合作,使用基于 Arm 的技术开发软件。 对于与基于 Arm 的 Windows 相关的任何缺失依赖项,可以向 Linaro 服务台提交请求,以帮助更新包支持

  • 考虑使用 Arm64EC。 Arm64EC 版本的依赖项可用于重新生成应用程序,同时仍然利用 x64 版本的依赖项。 Arm64EC 进程中的任何 x64 代码(包括来自依赖项的代码)都将在应用中以仿真方式运行。 (在这种情况下,Arm64 版本的依赖项不可用。)

  • 最后的选择是移除和/或替换应用项目的依赖项。

代码是针对 Arm64 以外的特定体系结构编写的

应用依赖于内核驱动程序

需要将内核驱动程序生成为本机 Arm64。 内核中不存在仿真。 这主要影响虚拟化方案。 对于所用设备驱动程序需要直接访问在内核模式(而非用户模式)下运行的操作系统或硬件内部,且尚未更新为支持 Arm64 处理器的应用,请参阅使用 WDK 生成 Arm64 驱动程序

此外,Windows 上的驱动程序需要生成为 Arm64,并且无法仿真。 对于依赖尚未更新为支持 Arm64 处理器的软件驱动程序的应用,请参阅使用 WDK 生成 Arm64 驱动程序

适用于基于 Arm 的 Windows 的工具链

除了对 Visual Studio 和 LLVM (CLANG) 的支持(如本指南的先决条件部分所分享),Arm64 还支持以下工具和框架:

以及第三方框架,包括:

需要帮助? 利用我们的应用保证服务

应用保证 Arm 咨询服务可用于帮助开发人员生成针对 Arm 进行了优化的应用。 这项服务是对我们现有承诺的补充:你的应用将在基于 Arm 的 Windows 上运行,如果遇到任何问题,Microsoft 将帮助你修正它们。 了解详细信息

注册 Windows Arm 咨询服务