Arm サポートを Windows アプリに追加する

Arm ベースのデバイスは、普及が進む AI および Machine Learning ワークロードに合わせてニューラル処理ユニット (NTU) を調整する Arm 版 Windows のサポートに加えて、電力の節約性、長持ちするバッテリー残量、素晴らしい処理能力により、ますます普及しています。

このガイドでは、Arm64 プロセッサを搭載したデバイスの Windows アプリにサポートを追加する手順について説明します。 また、Arm64 ベースのバージョンのアプリ作成に干渉する可能性がある潜在的な問題や阻害要因 (サード パーティの依存関係やプラグインなど) に対処する方法についても説明します。

x86 または x64 Windows アプリ用の Arm ベースのデバイスでのエミュレーション

ARM バージョンの Windows 10 には、既存の無修正 x86 アプリを ARM デバイスで実行できるようにするエミュレーション テクノロジが搭載されています。 Windows 11は、そのエミュレーションを拡張して、ARM 搭載デバイスで無修正の x64 Windows アプリを実行します。

ARM デバイスで x64 と x86 をエミュレートする機能は大きな前進ですが、このガイドは、Arm ネイティブ サポートを追加するのに役立ちます。これにより、アプリで、次のようなネイティブ パフォーマンスの向上と ARM64 搭載デバイス固有の特性を活用できるようになります。

  • アプリの消費電力を最適化して、デバイスのバッテリー残量を長持ちさせる。
  • CPU、GPU、および NTU のパフォーマンスを最適化して、特に AI 使用時にワークフローを高速化する。

さらに、カーネル ドライバー はネイティブ Arm64 としてビルドする必要があります。 カーネルにエミュレーションはありません。 これは主に仮想化シナリオに影響を及ぼします。 アプリが、ユーザー モードではなく、カーネル モードで実行されている OS またはハードウェアの内部への直接アクセスを必要とするデバイス ドライバーを利用しているが、Arm64 プロセッサをサポートするようにまだ更新されていない場合は、「WDK を使った Arm64 ドライバーのビルド」を参照してください。

Note

プログレッシブ Web アプリ (PWA) は、もとからネイティブの Arm64 パフォーマンスで実行されます。

前提条件

Arm ベースのデバイス (ネイティブ コンパイル - 実行しているのと同じプラットフォームのコードを生成する) を使用してアプリを更新する場合は、次のものを使用できます。

  • Visual Studio 2022 v17.4 以降。 これは、ARM ベースのプロセッサでの Arm64 アプリのビルドとデバッグをネイティブにサポートする、最初に GA リリースされた Visual Studio です。 Visual Studio 2022 17.4 と Microsoft Visual C++ (MSVC) の両方のネイティブ Arm64 バージョンで、以前のエミュレートされたバージョンと比較してパフォーマンスが大幅に向上しています。

  • (省略可能) LLVM (Clang) v12+ 以降。 LLVM 12 を使用すると、Clang コンパイラ、LLD リンカ、compiler-rt ランタイム ライブラリなど、Arm64 版 Windows でホストされている公式バイナリ リリースが追加されます。

x64 または x86 Intel ベースのデバイス (クロス コンパイル) を使用して Arm をサポートするように Windows アプリを更新する場合は、次のものを使用できます。

クロス コンパイルまたはネイティブ コンパイルのどちらかを選択する際には、使用可能なハードウェアやテスト実行のシンプルさなど、いくつかの要因を考慮する必要があります。

Note

GCC、GNU Compiler Collection のサポートは近い将来を目標としています。

Arm64 ネイティブ サポートを追加する手順

Arm64 でネイティブに実行するようにアプリを更新するには、次の手順を実施します。

  1. Visual Studio で Arm64 構成をプロジェクトに追加する
  2. 新しくビルドされた Arm64 アプリをテストしてデバッグする
  3. Arm デバイスでアプリをビルドしてテストする

アプリが Arm デバイス用に正常に最適化されたことを確認したら、次の手順を実施します。

  1. インストーラーを更新し、更新したアプリを発行する
  2. 継続的な更新プログラムを計画する

手順 1 - Visual Studio で Arm64 構成をプロジェクトに追加する

デバッグとリリースのターゲットを含む新しい ARM64 ソリューション プラットフォームを既存の x64 または x86 アプリ プロジェクトに追加するために、次の手順を実施します。

  1. Visual Studio でソリューション (プロジェクト コード) を開きます (サポートされているバージョンの「前提条件」を参照してください)。
  2. [標準] ツール バーの [Solution Platforms] (ソリューション プラットフォーム) ドロップダウン メニュー (または [Build] (ビルド) メニュー) で、[Configuration Manager...] (構成マネージャー...) を選択します。
  3. [Active solution platform] (アクティブ ソリューション プラットフォーム) ドロップダウン メニューを開き、[New...] (新規作成...) を選択します。
  4. [Type or select the new platform] (新しいプラットフォームを入力または選択する) ドロップダウン メニューで、[ARM64] を選択し、[設定のコピー元] の値が [Create new project platforms] (新しいプロジェクト プラットフォームを作成する) チェック ボックスがオンになっている状態で [x64] に設定されていることを確認し、[OK] を選択します。

おめでとうございます。 アプリへの Arm サポートの追加が開始されました。 次に、Arm64 ソリューションが正常にビルドされたかどうかを確認します。

ソリューションが正常にビルドされない場合は、ビルドが失敗する原因となっている問題を解決する必要があります。 最も可能性の高い理由は、依存関係が ARM64 で使用できない場合です。これは、以下の「トラブルシューティング」で説明します。

(省略可能): アプリ バイナリが Arm64 用にビルドされたことを直接確認する場合は、PowerShell でプロジェクト ディレクトリを開くことができます (Visual Studio ソリューション エクスプローラーでアプリ プロジェクトを右クリックし、[ターミナルで開く] を選択します)。 プロジェクトの新しい bin\ARM64\Debug ディレクトリまたはリリース ディレクトリが選択されるようにディレクトリを変更します。 コマンド dumpbin /headers .\<appname>.exe を入力します (<appname> をアプリの名前に置き換えます)。 ターミナルの出力結果を上にスクロールして FILE HEADER VALUES セクションを見つけ、最初の行が AA64 machine (ARM64) であることを確認します。

手順 2 - 新しくビルドされた Arm64 アプリをテストしてデバッグする

Visual Studio で Arm64 ソリューション プラットフォームをプロジェクトに追加した後、Arm64 ソリューションが正常にビルドされるかどうかをチェックするために、次の手順を実施します。

  1. [Active solution platform] (アクティブ ソリューション プラットフォーム) ウィンドウを閉じます。
  2. ビルド設定を [デバッグ] から [リリース] に変更します。
  3. [ビルド] ドロップダウン メニューで、[ソリューションのリビルド] を選択し、プロジェクトのリビルドを待ちます。
  4. [リビルドがすべて正常に終了しました。] という出力が表示されます。 表示されない場合は、以下の「トラブルシューティング」セクションを参照してください。

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 を作成する」を参照してください。

手順 3 - Arm デバイスでアプリをビルドしてテストする

テスト自動化パスの追加は、継続的インテグレーションと継続的デリバリー (CI/CD) 戦略を検討する上で重要です。 Windows で実行されている Arm64 ソリューションの場合は、Arm64 アーキテクチャでテスト スイートを実行することが重要です。これは、上記の Arm デバイスのいずれか、または上記の VM の仮想マシンを使用した Arm 版 Windows の実際のハードウェアとなります。

テストと同じコンピューターで実行すると、アプリのコンパイルが便利になりますが、多くの場合は必要ありません。 代わりに、既存のビルド インフラストラクチャを拡張して、Arm64 のクロスコンパイル出力を生成することを検討できます。

手順 4 - インストーラーを更新し、更新したアプリを発行する

Microsoft Store に発行する場合は、上記の手順に従って Arm64 バージョンのアプリをビルドしたら、パートナー センター ダッシュボード にアクセスし、新しくビルドされた ARM64 バイナリを申請に追加することで、Microsoft Store の既存のアプリ パッケージを更新できます。

アプリが Microsoft Store にまだ発行されていない場合は、手順に従って、MSI または EXE、MSIX パッケージ、PWA、または App アドオンなどの送信するものに基づいてアプリの申請を作成できます。

独自のインストーラーをビルドする場合は、新しい Arm64 バージョンを正常にインストールできることを確認する必要があります。 WiXSquirrelInnoSetupInstallAware などのほとんどのインストーラー フレームワークでは、問題なく Arm 版 Windows がサポートされます。

Web ページからアプリのインストーラーを提供する場合は、ユーザーエージェント クライアント ヒントを使用して、顧客が Arm 版 Windows のデバイスからアクセスしているタイミングを検出し、更新された Arm ネイティブ バージョンのアプリを提供できます。 ユーザーエージェント文字列とは異なり、ユーザーエージェント クライアント ヒントを使用すると、Arm の顧客と x86 デバイスの顧客を区別できます。

手順 5 - 継続的な更新プログラムを計画する

アプリの Arm64 バージョンが発行されたので、他のバージョンのアプリと同じ方法で更新された状態を維持する必要があります。 将来的に顧客の混乱を避けるためには、バージョンと機能をアーキテクチャ間で調整しておくことをお勧めします。

トラブルシューティング

既存の Arm64 バージョンの x64 または x86 の Windows アプリの追加に干渉したり、妨げたりする可能性がある一般的な問題は次のとおりです。

ARM64 用にコンパイルされていない依存関係が正常なビルドを妨げている

内部、サード パーティ、オープンソース ライブラリなどの依存関係が原因でビルドできない場合は、ARM64 アーキテクチャをサポートするように依存関係を更新する方法を見つけるか、削除する必要があります。

  • 内部の依存関係の場合は、ARM64 サポート用の依存関係をリビルドすることをお勧めします。

  • サード パーティの依存関係の場合は、ARM64 サポートを使用してリビルドするようメンテナンス担当者に要求することをお勧めします。

  • オープン ソースの依存関係については、vcpkg を検査して、更新可能な ARM64 サポートを含む新しいバージョンの依存関係が存在するかどうかを確認することを検討してください。 更新プログラムが存在しない場合は、ARM64 サポートをパッケージにご自身で追加することを検討してください。 多くのオープン ソースのメンテナンス担当者は、この作業に感謝することでしょう。

  • Linaro も、企業やオープン ソース コミュニティと連携して、Arm ベースのテクノロジ向けのソフトウェアを開発しています。 Linaro サービス デスクに要求を提出して、Arm 版 Windows に関連する不足している依存関係のパッケージ サポートを更新することができます。

  • Arm64EC の使用を検討してください。 Arm64EC バージョンの依存関係は、x64 バージョンの依存関係を引き続き利用しながら、アプリケーションをリビルドするために使用します。 依存関係からのコードを含む、Arm64EC プロセスの x64 コードは、アプリのエミュレーションで実行されます。 (この場合、Arm64 バージョンの依存関係は使用できません)。

  • 最後の選択肢は、アプリ プロジェクトの依存関係を削除または置換することです。

コードが Arm64 以外の特定のアーキテクチャ用に記述されている

アプリがカーネル ドライバーに依存している

カーネル ドライバーはネイティブ 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 互換性があります。

サード パーティのフレームワークと同様に、次の機能が含まれます。

サポートが必要な場合 App Assure サービスを活用する

App Assure Arm Advisory Service は、開発者が Arm 最適化アプリをビルドするのに役立ちます。 このサービスは、アプリは Arm 版 Windows で実行され、問題が発生した場合は Microsoft が修復を支援する、という Microsoft の既存の約束に加えられます。 詳細情報 を参照してください。

Windows Arm アドバイザー業務にサインアップします