排查 x86 桌面应用问题

重要

使用 Visual Studio 2017 或更高版本,可以将应用重新编译到 Arm64 或 Arm64EC,以便应用以完全本机速度运行。 有关编译为 Arm64 的详细信息,请参阅博客文章: 正式支持 Arm 开发上的 Windows 10。 有关 Arm64EC 的信息,请参阅 宣布推出 Arm64EC:在 Arm 上生成适用于 Windows 11 的本机和可互操作应用。

如果 x86 桌面应用在 x86 计算机上无法正常工作,可参考以下指南帮助你进行故障排除。

问题 解决方案
你的应用依赖于不是针对 Arm 设计的驱动程序。 将 x86 驱动程序重新编译到 Arm64。 请参阅使用 WDK 构建 Arm64 驱动程序
你的应用仅适用于 x64。 如果针对 Microsoft Store 进行开发,请提交应用的 Arm 版本。 有关详细信息,请参阅 应用包体系结构。 如果你是 Win32 开发人员,我们建议将应用重新编译到 Arm64。 有关详细信息,请参阅 适用于 Arm 开发的 Windows 10 的 Visual Studio 早期预览版。
你的应用使用低于 1.1 的 OpenGL 版本,或者需要硬件加速的 OpenGL。 使用应用的 DirectX 模式(如果可用)。 使用 DirectX 9、DirectX 10、DirectX 11 和 DirectX 12 的 x86 应用可在 Arm 上运行。 有关详细信息,请参阅 DirectX 图形和游戏
x86 应用无法按预期工作。 请遵循 Arm 上的程序兼容性疑难解答中的指导,尝试使用兼容性疑难解答。 有关其他一些故障排除步骤,请参阅 Arm 上的 x86 应用疑难解答文章。

WOW 的最佳做法

当应用发现它在 WOW 下运行,然后假定它位于 x64 系统上时,会出现一个常见问题。 做出此假设后,应用可能会执行以下操作:

  • 尝试安装 Arm 不支持的 x64 版本本身。
  • 检查本机注册表视图下的其他软件。
  • 假设有 64 位 .NET 框架可用。

通常,当应用确定在 WOW 下运行时,不应对主机系统做出假设。 避免尽可能多地与 OS 的本机组件进行交互。

应用可以在本机注册表视图下放置注册表项,或者根据 WOW 的存在执行函数。 原来的 IsWow64Process 只指示应用是否在 x64 计算机上运行。 应用现在应使用 IsWow64Process2 来确定它们是否在具有 WOW 支持的系统上运行。

驱动程序

必须编译所有内核模式驱动程序、 用户模式驱动程序框架(UMDF) 驱动程序和打印驱动程序,以匹配 OS 的体系结构。 如果 x86 应用具有驱动程序,则必须为 Arm64 重新编译该驱动程序。 但是,x86 应用在仿真下可能运行正常,但是,需要为 Arm64 重新编译其驱动程序,并且依赖于驱动程序的任何应用体验都不可用。 有关为 Arm64 编译驱动程序的详细信息,请参阅 使用 WDK 生成 Arm64 驱动程序。

外壳扩展

尝试将 Windows 组件或将其 DLL 加载到 Windows 进程中的应用需要重新编译这些 DLL 以匹配系统的体系结构;即 Arm64。 输入法编辑器 (IME)、辅助技术、shell 扩展应用通常会使用这种方法(例如,在资源管理器中显示云存储图标或右键单击上下文菜单)。 若要了解如何将应用或 DLL 重新编译到 Arm64,请参阅 Arm 开发 博客文章上对 Windows 10 的 Visual Studio 支持的早期预览版。

调试

若要更深入地调查应用的行为,请参阅 Arm 上的调试,了解有关在 Arm 上进行调试的工具和策略的详细信息。

虚拟机

Qualcomm Snapdragon 835 移动电脑平台不支持 Windows 虚拟机监控程序平台。 因此,使用 Hyper-V 运行虚拟机将不起作用。 我们将继续在这些技术上投资未来高通芯片集。

动态代码生成

X86 桌面应用通过系统在运行时生成 Arm64 指令来模拟 Arm64。 这意味着,如果 x86 桌面应用在其进程中阻止动态代码生成或修改,则不支持该应用在 Arm64 上运行为 x86。

这是一些应用使用带有 ProcessDynamicCodePolicy 标志的 SetProcessMigrationPolicy API在其进程上启用的安全缓解措施。 若要在 Arm64 上成功作为 x86 进程运行,必须禁用此缓解策略。