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。 有关详细信息,请参阅 Visual Studio 对 Arm 开发Windows 10支持的早期预览版。
你的应用使用了高于 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 Framework。

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

应用可以将注册表项放在本机注册表视图下,或者根据 WOW 的存在执行功能。 原来的 IsWow64Process 只指示应用是否在 x64 计算机上运行。 现在,应用应该使用 IsWow64Process2 确定自己是否运行在带有 WOW 支持的系统上。

驱动程序

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

外壳扩展

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

调试

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

虚拟机

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

动态代码生成

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

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