Arm ベースのデバイスは、ますます人気が高まる AI および Machine Learning ワークロード用に調整されたニューラル処理ユニット (NPU) の Windows on Arm サポートに加えて、電力倹約性、バッテリー寿命の長さ、印象的な処理能力により、ますます人気が高まっています。
このガイドでは、Arm64 プロセッサを搭載したデバイスの Windows アプリにサポートを追加する手順について説明します。 また、Arm64 ベースのバージョンのアプリの作成に干渉する可能性がある潜在的な問題や阻害要因 (サード パーティの依存関係やプラグインなど) に対処する方法についても説明します。
x86 または x64 Windows アプリ用の Arm ベースデバイスでのエミュレーション
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 アプリ (PWA) は、ネイティブ Arm64 パフォーマンスで既に実行されます。
[前提条件]
Arm ベースのデバイス (ネイティブ コンパイル - 実行しているのと同じプラットフォームのコードを生成する) を使用してアプリを更新する場合は、次を使用できます。
Visual Studio 2022 v17.4 以降
これは、Arm ベースのプロセッサでの Arm64 アプリのビルドとデバッグをネイティブにサポートする Visual Studio の最初の GA リリースです。 Visual Studio 2022 17.4 と Microsoft Visual C++ (MSVC) ネイティブ Arm64 の両方のバージョンは、以前のエミュレートされたバージョンと比較して大幅に優れたパフォーマンスを提供します。 (オプション) LLVM (Clang) バージョン12以上 またはそれ以降。 LLVM 12 は、Clang コンパイラ、LLD リンカー、コンパイラ rt ランタイム ライブラリなど、Arm64 上の Windows でホストされている公式バイナリ リリースを追加します。
x64 または x86 Intel ベースのデバイス (クロス コンパイル) を使用して Arm をサポートするように Windows アプリを更新する場合は、次を使用できます。
- Visual Studio 2022 v17.10 (推奨)
- Visual Studio 2019 v16.x
- Visual Studio 2017 v15.9 以降 (UWP、デスクトップ ブリッジ、win32 C++)
- LLVM (Clang) v12+
クロス コンパイルまたはネイティブ コンパイルのどちらかを選択する際には、使用できるハードウェアやテスト実行のシンプルさなど、いくつかの要因を考慮する必要があります。
注
GCC 、GNU コンパイラ コレクション サポートは近い将来を対象とします。
Arm64 ネイティブ サポートを追加する手順
Arm64 でネイティブに実行するようにアプリを更新するには:
- Visual Studio で Arm64 構成をプロジェクトに追加する
- 新しくビルドされた Arm64 アプリのテストとデバッグ
- Arm デバイスでアプリをビルドしてテスト
アプリが Arm デバイス用に正常に最適化されたことを確認したら、次のようにします。
手順 1 - Visual Studio で Arm64 構成をプロジェクトに追加する
デバッグ ターゲットとリリース ターゲットを含む新しい ARM64 ソリューション プラットフォームを既存の x64 または x86 アプリ プロジェクトに追加するには:
- Visual Studio でソリューション (プロジェクト コード) を開きます (サポートされているバージョンの前提条件
参照)。 - 標準ツール バーの [ソリューション プラットフォーム] ドロップダウン メニュー (または [ビルド] メニュー) で、Configuration Manager 選択します。..
- [Active solution platform]\(アクティブ なソリューション プラットフォーム\) ドロップダウン メニューを開き、[ <新規...>を選択します。
- [Type or select the new platform]\(新しいプラットフォームを入力または選択する\) ドロップダウン メニューで、ARM64
選択し、[Create new project platforms]\(新しいプロジェクト プラットフォームの作成\) チェックボックスが有効になっている [Copy settings from]\(設定のコピー元\) の値が [x64 に設定されていることを確認してから、[OK] 選択します。
おめでとうございます! Arm サポートのアプリへの追加を開始しました。 次に、Arm64 ソリューションが正常にビルドされたかどうかを確認します。
ソリューションが正常にビルドされない場合は、ビルドの失敗の原因となっている問題を解決する必要があります。 最も可能性の高い理由は、依存関係が ARM64 で使用できないということです。これは、以下の トラブルシューティング で説明します。
bin\ARM64\Debug
またはリリース ディレクトリが選択されるようにディレクトリを変更します。
dumpbin /headers .\<appname>.exe
コマンドを入力します (<appname>
はアプリの名前に置き換えます)。 ターミナルの出力結果を上にスクロールして FILE HEADER VALUES
セクションを見つけ、最初の行が AA64 machine (ARM64)
されていることを確認します。
手順 2 - 新しくビルドされた Arm64 アプリをテストしてデバッグする
Visual Studio で Arm64 ソリューション プラットフォームをプロジェクトに追加した後、Arm64 ソリューションが正常にビルドされたかどうかを確認するには:
- [アクティブ なソリューション プラットフォーム] ウィンドウを閉じます。
- ビルド設定を Debug から Releaseに変更します。
- [ビルド] ドロップダウン メニューで、[ソリューションのリビルド]
選択し、プロジェクトのリビルドを待ちます。 - "すべてリビルドに成功しました" という出力が表示されます。 そうでない場合は、後述の「トラブルシューティングの」セクションを参照してください。
Arm64 をサポートするためにアプリ用にバイナリがビルドされたら、それらをテストします。 そのためには、デバイスまたは仮想マシンが Arm 上で Windows を実行している必要があります。
Arm デバイス上の Windows で開発を行っている場合は、Visual Studio のローカル デバッグを使用して簡単にセットアップできます。 (Arm プロセッサで実行されていないデバイスを使用して) クロスコンパイルする場合は、Arm デバイス上の Windows または仮想マシンでリモート デバッグを使用して、別のデバイスで Arm64 アプリを実行しているときに Visual Studio で開発エクスペリエンスを有効にする必要があります。
テストに使用できる Arm ハードウェアまたは仮想マシン上の Windows
継続的インテグレーション (CI) とテストに使用するハードウェアをお探しの場合は、Arm64 ベースのプロセッサを搭載した Windows デバイスの一部を次に示します。
CI とテストをサポートするために、Arm 上で Windows を実行する仮想マシン (VM) のセットアップについては、「 クイック スタート: Azure portal で Arm 仮想マシン上に Windows を作成する」を参照してください。
Arm64 ベースのバージョンの Windows 11 Pro および Enterprise を実行する機能を備 えた Ampere Altra Arm ベースのプロセッサを搭載した Azure Virtual Machines の一般提供に関する Azure ブログのお知らせをお読みください。
Hyper-V と Windows Insider VHDX を使用して Arm VM 上にローカル Windows を作成するための、 Arm Insider Preview (VHDX) の Windows 11 の詳細について説明します。 *Arm64 VM は、前提条件を満たすデバイスでのみサポートされます。 x64 ハードウェアでの Arm64 VM の作成はサポートされていません。クラウドで VM をホストする必要があります。上記のクイック スタート リンクを参照してください。
ビデオ「エキスパートに質問する: Ampere ベースの Azure VM を使用してアプリを作成する」をご覧ください。
手順 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 バージョンを正常にインストールできることを確認する必要があります。 WiX、Squirrel、InnoSetup、InstallAwareなど、ほとんどのインストーラー フレームワークは、問題なく Windows on Arm をサポートします。
Web ページからアプリのインストーラーを提供する場合は、User-Agent クライアント ヒント を使用して、顧客がいつ Arm デバイス上の Windows からアクセスするかを検出し、更新された Arm ネイティブ バージョンのアプリを提供できます。 ユーザー エージェント文字列とは異なり、User-Agent クライアント ヒントを使用すると、Arm の顧客と x86 デバイスの顧客を区別できます。
手順 5 - 進行中の更新プログラムを計画する
アプリの Arm64 バージョンが公開されたので、他のバージョンのアプリと同じ方法で更新された状態を維持する必要があります。 将来、お客様の混乱を避けるために、バージョンと機能をアーキテクチャ間で調整しておくことをお勧めします。
トラブルシューティング
既存の x64 または x86 Windows アプリの Arm64 バージョンの追加を妨げたり、ブロックしたりする可能性がある一般的な問題は次のとおりです。
- ARM64 用にコンパイルされていない依存関係がビルドの成功を妨げている。
- コードは、Arm64 以外の特定のアーキテクチャ用に記述されています。
- アプリはカーネル ドライバーに依存しています。
- あなたは立ち往生していて、支援が必要です。
ARM64 用にコンパイルされていない依存関係によって、ビルドが成功するのを妨げている
依存関係が原因でビルドできない場合は、内部、サード パーティ、またはオープンソース ライブラリから、ARM64 アーキテクチャをサポートするように依存関係を更新する方法を見つけるか、削除する必要があります。
内部依存関係の場合は、ARM64 サポートの依存関係を再構築することをお勧めします。
サード パーティの依存関係の場合は、ARM64 サポートを使用してリビルドするようにメンテナーに要求を提出することをお勧めします。
オープン ソースの依存関係については、vcpkg
チェックして、ARM64 のサポートを含む依存関係の新しいバージョンが存在するかどうかを確認することを検討してください。 更新プログラムが存在しない場合は、ARM64 サポートをパッケージに追加することを検討してください。 多くのオープンソースの保守担当者は、この貢献に感謝するでしょう。 Linaro 組織は、企業やオープン ソース コミュニティとも連携して、Arm ベースのテクノロジに基づくソフトウェアを開発しています。 Linaro サービス デスクにリクエストを 提出して、Windows on Arm に関連する不足する依存関係に対するパッケージサポート を更新するために支援を依頼できます。
Arm64ECを使用することを検討してください。 Arm64EC バージョンの依存関係は、x64 バージョンの依存関係を引き続き利用しながら、アプリケーションを再構築するために使用できます。 Arm64EC プロセスの依存関係からのコードを含む x64 コードは、アプリのエミュレーションで実行されます。 (この場合、Arm64 バージョンの依存関係は使用できません)。
最後の選択肢は、アプリ プロジェクトへの依存関係を削除したり置き換えたりすることです。
コードは、Arm64 以外の特定のアーキテクチャ用に記述されています
- CPU 固有のアセンブリまたはインライン組み込み関数呼び出しは、Arm CPU で使用可能な命令と関数と一致するように変更する必要があります。 ガイダンスについては、「C または C++ コードでのアセンブリと組み込みの使用の
」を参照してください。
アプリがカーネル ドライバーに依存している
カーネル ドライバー は、ネイティブ Arm64 としてビルドする必要があります。 カーネルにエミュレーションはありません。 これは主に仮想化シナリオに影響します。 ユーザー モードではなく、カーネル モードで実行されている OS またはハードウェアの内部に直接アクセスする必要があるデバイス ドライバーを利用し、まだ Arm64 プロセッサをサポートするように更新されていないアプリについては、「WDKを使用した Arm64 ドライバーのビルド」
さらに、 Windows 上のドライバー は Arm64 としてビルドする必要があり、エミュレートすることはできません。 Arm64 プロセッサをサポートするようにまだ更新されていないソフトウェア ドライバーに依存するアプリについては、「WDKを使用した Arm64 ドライバーのビルド
Arm 上の Windows 用ツールチェーン
このガイドの「の前提条件」セクションで共有されている 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 互換です。
サード パーティのフレームワークと同様に、次の機能が含まれます。
- Qt for Windows、Boost C++ Library、Bazel、オープンソース ビルドおよびテスト ツール。
- Linaroでは、GCC と Mingw/GNU Toolchain for Windows on Arm のサポートが
進行中。 - 詳細な一覧については、「Windows On Arm (WOA) - Confluence (atlassian.net)を参照してください。
サポートが必要ですか? App Assure サービスを活用する
App Assure Arm Advisory Service は、開発者が Arm 最適化アプリを構築するのに役立ちます。 このサービスは、アプリは Arm 版 Windows で実行され、問題が発生した場合は Microsoft が修復を支援する、という Microsoft の既存の約束に加えられます。 詳細については、こちらを参照してください。
Windows on Arm