對 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 開發提早預覽 Visual Studio 對 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 下執行時,不應該對主機系統進行假設。 請盡量避免與 OS 的原生元件互動。
應用程式可以在原生登錄檢視下放置登錄機碼,或根據 WOW 的存在來執行函式。 原始 IsWow64Process 只會指出應用程式是否在 x64 電腦上執行。 應用程式現在應該使用 IsWow64Process2 來判斷它們是否在具有 WOW 支援的系統上執行。
驅動程式
所有核心模式驅動程式、使用者模式驅動程式架構 (UMDF) 驅動程式和列印驅動程式都必須編譯,以符合 OS 的架構。 如果 x86 應用程式具有驅動程式,則必須針對 Arm64 重新編譯該驅動程式。 不過,在模擬下,x86 應用程式可能會正常執行,其驅動程式必須針對 Arm64 重新編譯,而相依於驅動程式的任何應用程式體驗將無法使用。 如需編譯 Arm64 驅動程式的詳細資訊,請參閱使用 WDK 建置 Arm64 驅動程式。
殼層延伸
嘗試將 Windows 元件連結或將其 DLL 載入 Windows 處理序的應用程式,必須重新編譯這些 DLL 以符合系統的架構,亦即 Arm64。 這些通常是由輸入法編輯器 (IME)、輔助技術和殼層延伸模組應用程式使用 (例如,在 Explorer 中顯示雲端記憶體圖示,或以滑鼠右鍵按一下 [內容] 選單)。 若要了解如何將應用程式或 DLL 重新編譯為 Arm64,請參閱針對 Arm 開發提早預覽 Visual Studio 對 Windows 10 的支援部落格文章。
偵錯
若要更深入地調查應用程式的行為,請參閱在 ARM 上偵錯以深入了解 Arm 上偵錯的工具和策略。
虛擬機器
Qualcomm Snapdragon 835 行動 PC 平台不支援 Windows Hypervisor 平台。 因此,使用 Hyper-V 執行虛擬機器將無法運作。 我們繼續在這些技術上投資未來 Qualcomm 晶片組。
動態程式碼產生
系統會在執行階段產生 Arm64 指令,在 Arm64 上模擬 X86 傳統型應用程式。 這表示如果 x86 傳統型應用程式在其程式中防止動態程式碼產生或修改,則無法支援該應用程式在 Arm64 上以 x86 身分執行。
這是一種安全性防護功能,有些應用程式會使用 SetProcessMitigationPolicy API 搭配ProcessDynamicCodePolicy
旗標在其程式上啟用。 若要在 Arm64 上以 x86 處理程序成功執行,則必須停用此風險降低原則。