向 Windows 應用程式新增 Arm 支援
除了針對日益受歡迎的 AI 和 機器學習工作負載調整的 Windows on Arm 支援外,Arm 型裝置因其節電性質、更長的電池使用時間,以及令人印象深刻的處理能力,也越來越受歡迎。
本指南內容涵蓋針對由 Arm64 處理器提供之裝置,將支援新增至 Windows 應用程式的步驟。 指引內容也涵蓋解決任何潛在問題或封鎖程式 (例如第三方相依性或外掛程式) 可能干擾您應用程式建立 Arm64 型版本的方法。
Windows 10 的 Arm 版本包含模擬技術,可讓現有的未修改 x86 應用程式在 Arm 裝置上執行。 Windows 11 擴充該模擬,可在 Arm 支援的裝置上執行未修改的 x64 Windows 應用程式。
雖然在 Arm 裝置上模擬 x64 和 x86 的能力已是向前邁出的一大步,但本指南會協助您新增 Arm 原生支援,讓您的應用程式能充分利用原生效能的提升和 Arm64 支援裝置的獨特品質,包括:
- 將應用程式的耗電量最佳化,以延長裝置的電池使用時間。
- 將 CPU、GPU 和 NPU 的效能最佳化,以加速工作流程,特別是在使用 AI 時。
此外,核心驅動程式必須建置為原生 Arm64。 核心不存在模擬。 這主要會影響虛擬化案例。 如需使用需要直接存取核心模式中執行之 OS 或硬體內部,而不是使用者模式的應用程式,以及尚未更新以支援 Arm64 處理器的應用程式,請參閱使用 WDK 建置 Arm64 驅動程式。
注意
漸進式 Web Apps (PWA) 已使用原生 Arm64 效能執行。
如果您要使用 Arm 型裝置來更新應用程式 (原生編譯 - 為正在運作的相同平台產生程式碼),您可以使用:
Visual Studio 2022 v17.4 或更新版本。 這是 Visual Studio 的第一個 GA 版本,原生支援在 Arm 型處理器上產生和偵錯 Arm64 應用程式。 Visual Studio 2022 17.4 和 Microsoft Visual C++ (MSVC) 原生 Arm64 版本相較於先前的模擬版本,提供大幅提高的效能。
(選用) LLVM (Clang) v12+ 或更新版本。 LLVM 12 新增裝載在 Arm64 上 Windows 的正式二進位版本,包括 Clang 編譯程式、LLD 連結器和編譯程式 rt 執行階段程式庫。
如果您要更新 Windows 應用程式以支援使用 x64 或 x86 Intel 型裝置的 Arm (交叉編譯),您可以使用:
- Visual Studio 2022 v17.10 (建議使用)
- Visual Studio 2019 v16.x
- Visual Studio 2017 v15.9 及更新版本 (UWP,傳統型橋接器,win32 C++)
- LLVM (Clang) v12+
在交叉編譯或原生編譯之間選擇時,需要考量幾個因素,例如可用的硬體和測試執行的簡易性。
注意
GCC,GNU 編譯器集合支援目標定於近期。
若要更新您的應用程式以原生方式在 Arm64 上執行:
確認您的應用程式已成功針對 Arm 裝置進行最佳化之後:
若要將具有偵錯和發行目標的新 ARM64 解決方案平台新增至現有的 x64 或 x86 應用程式專案:
- 在 Visual Studio 中開啟您的解決方案 (專案程式碼) (請參閱支援版本的必要條件)。
- 在 [標準] 工具列的 [解決方案平台] 下拉式功能表中,選取 [組態管理員...]
- 開啟 [作用中解決方案平台] 下拉式功能表,然後選取 [新增...]<>。
- 在 [輸入或選取新平台] 下拉式功能表中,選取 ARM64,並確定 [複製設定值來源] 值設定為 x64 並啟用 [建立新專案平台] 核取方塊,然後選取 [確定]。
恭喜! 您已開始將 Arm 支援新增至您的應用程式。 接下來,查看 Arm64 解決方案組建是否成功。
如果解決方案未成功建置,您必須解決導致建置失敗的問題。 最有可能的原因是 ARM64 無法使用相依性,其涵蓋於下列疑難排解中。
(選用):如果您想先確認現在已針對 Arm64 建置應用程式二進位檔,您可以在 PowerShell 中開啟專案目錄 (在 Visual Studio 解決方案總管中以滑鼠右鍵按一下應用程式專案,然後選取 [在終端機中開啟]。 變更目錄,以便選取專案的新 bin\ARM64\Debug
或發行目錄。 輸入命令:dumpbin /headers .\<appname>.exe
(將 <appname>
取代為您的應用程式名稱)。 在終端機的輸出結果中向上捲動以尋找 FILE HEADER VALUES
區段,並確認第一行為 AA64 machine (ARM64)
。
若要在 Visual Studio 中將 Arm64 解決方案平台新增至您的專案後,檢查您的 Arm64 解決方案組建是否成功:
- 關閉 [作用中解決方案平台] 視窗。
- 將組建設定從 [偵錯] 變更為 [發行]。
- 在 [建置] 下拉式功能表中,選取 [重建方案],並等候專案重建。
- 您會收到 [全部重建成功] 輸出。 如果沒有,請參閱底下的疑難排解區段。
在為應用程式建置二進位檔以支援 Arm64 之後,您會想要測試這些二進位檔。 要進行測試就必須有在 Arm 上執行 Windows 的裝置或虛擬機器。
如果您要在 Windows on ARM 裝置上進行開發,您可以使用 Visual Studio 本機偵錯輕鬆設定。 如果進行交叉編譯 (使用未在 ARM 處理器上執行的裝置),當在另一部裝置上執行 ARM64 應用程式時,您會想要在 Windows on ARM 裝置或虛擬機器上使用遠端偵錯,在 Visual Studio 中啟用開發體驗。
如果您要尋找硬體以用於持續整合 (CI) 和測試,以下是一些具有 Arm64 型處理器的 Windows 裝置:
如需有關設定在 Arm 上執行 Windows 以支援 CI 和測試的虛擬機器 (VM) 的說明,請參閱快速入門:在 Azure 入口網站 中建立 Arm 虛擬機器上的 Windows。
閱讀 Azure 部落格公告,其宣布 Azure 虛擬機器配備 Ampere Altra Arm 型處理器全面上市,能夠執行 Arm64 型 Windows 11 專業版和企業版。
深入了解 Windows 11 on Arm Insider Preview (VHDX) 以使用 Hyper-V 和 Windows 測試人員 VHDX 在 Arm VM 上建立本機 Windows。 *只有符合必要條件的裝置才支援 Arm64 VM。 x64 硬體不支援建立 Arm64 VM - 您必須在雲端裝載 VM,相關資訊請參閱上述快速入門連結。
新增測試自動化階段是持續整合及持續交付 (CI/CD) 策略的重要考量。 針對在 Windows 上執行的 Arm64 解決方案,請務必在 Arm64 架構上執行您的測試套件 -- 這可能是 Arm 硬體上的實際 Windows,使用上述之其中一個 Arm 裝置,或上述 VM 中的虛擬機器。
在與測試相同的機器上完成時,編譯應用程式更為方便,但在許多情況下並非必要。 相反地,您可以考慮擴充現有的建置基礎結構,以產生 Arm64 的交叉編譯輸出。
如果發佈至 Microsoft Store,只要遵循上述步驟建置 Arm64 版本的應用程式,就可以瀏覽合作夥伴中心儀表板,並將新建的 ARM64 二進位檔新增至提交,以更新 Microsoft Store 中的現有應用程式套件。
如果您的應用程式尚未在 Microsoft Store 中發布,您可以遵循指示,根據您要提交 MSI 或 EXE、MSIX 套件、PWA 或應用程式附加元件來建立應用程式提交。
如果您建置自己的安裝程式,您應該確定能夠成功安裝新的 Arm64 版本。 大部分的安裝程式架構如WiX, Squirrel, InnoSetup, InstallAware 和其也,都能支援 Arm上的 Windows,毫無問題。
如果您從網頁提供應用程式的安裝程式,您可以使用 User-Agent 用戶端提示來偵測客戶何時從 Arm 裝置上的 Windows 瀏覽,並提供您應用程式之已更新 Arm 原生版本。 不同於使用者代理程式字串,User-Agent 用戶端提示可讓您區分 Arm 上的客戶與 x86 裝置上的客戶。
既然您已發行 Arm64 版本的應用程式,您現在想要確保它的保持更新方式與其他應用程式版本相同。 最好讓版本和功能跨架構保持一致,以避免未來客戶混淆。
可能會干擾或封鎖您新增現有 x64 或 x86 Windows 應用程式的 Arm64 版本常見問題包括:
如果您因為相依性、內部、第三方或開放原始碼程式庫而無法建置,您必須尋找方法來更新該相依性來支援 ARM64 架構或移除它。
針對內部相依性,建議您重建 ARM64 支援的相依性。
針對第三方相依性,我們建議提出要求維護者使用 ARM64 支援重建。
針對開放原始碼相依性,請考慮檢查 vcpkg,以查看包含 ARM64 支援的較新版本是否存在相依性,讓您可以更新為該相依性。 如果沒有更新,請考慮自行新增 ARM64 支援至套件。 許多開放原始碼維護人員都受到此付出的幫助。
Linaro 組織還與企業和開放原始碼社群合作,開發 Arm 型技術軟體。 您可以向 Linaro Service Desk 提出要求,協助更新與 Arm 上 Windows 相關的任何遺漏相依性更新套件支援 。
請考慮使用 Arm64EC。 Arm64EC 版本的相依性可用來重建應用程式,同時仍使用 x64 版本的相依性。 Arm64EC 程式中的任何 x64 程式碼,包括相依性的程式碼,都會在應用程式中的模擬下執行。 (在此案例中,無法使用 Arm64 版本的相依性。)
最後一個選擇是移除和/或取代應用程式專案的相依性。
- 必須修改 CPU 特定組件或內嵌的內部函數呼叫,以符合 Arm CPU 上的可用指令和函式。 如需指引,請參閱:在 C 或 C++ 程式碼中使用組件和內建項目。
核心驅動程式必須建置為原生 Arm64。 核心不存在模擬。 這主要會影響虛擬化案例。 如需使用需要直接存取核心模式中執行之 OS 或硬體內部,而不是使用者模式的應用程式,以及尚未更新以支援 Arm64 處理器的應用程式,請參閱使用 WDK 建置 Arm64 驅動程式。
此外,Windows 上的驅動程式必須建置為 Arm64,且無法模擬。 如需依賴尚未更新以支援 Arm64 處理器之軟體驅動程式的應用程式,請參閱使用 WDK 建置 Arm64 驅動程式。
除了在本指南的必要條件一節中共用的 Visual Studio和LLVM (CLANG) 支援之外,Arm64 也支援下列工具和架構:
- .NET 7
- .NET 6 (LTS)
- .NET 5.0.8+
- .NET Framework 4.8.1
- clang-cl 會編譯適用於 Windows 的 C++ 程式碼,並可做為 MSVC 編譯程式和連結器的卸載取代。 它仍然使用 MSVC 的標頭和程式庫,且與 MSVC ABI 相容。
以及第三方架構,包括:
- 適用於 Windows 的 Qt、Boost C++ 程式庫、 Bazel、開放原始碼組建和測試工具。
- Linaro 正在為 Arm 上的 Windows 提供 GCC 和 Mingw / GNU 工具鏈的支援。
- 如需更完整的清單,請參閱 Windows On Arm (WOA) - Confluence (atlassian.net)。
應用程式保證 Arm 諮詢服務可協助開發人員建置 Arm 最佳化應用程式。 這項服務是對我們現有承諾的補充:您的應用程式將會在 Arm 上的 Windows 上執行,如果您遇到任何問題,Microsoft 將會協助補救。 深入了解。