Windows 10 SDK の各リリースには、活用したい魅力的な新機能が追加されています。 ただし、すべての顧客がデバイスを最新バージョンのWindows 10に同時に更新するわけではありません。また、アプリが可能な限り幅広いデバイスで動作することを確認する必要があります。 ここでは、以前のバージョンのWindows 10で実行されるようにアプリを設計する方法について説明しますが、最新の更新プログラムがインストールされたデバイスでアプリが実行されるたびに新機能を利用します。
アプリが最も広範なWindows 10 デバイスをサポートしていることを確認するには、3 つの手順を実行する必要があります。
- まず、最新の API をターゲットにするようにVisual Studio プロジェクトを構成します。 これは、アプリのコンパイル時の動作に影響します。
- 次に、ランタイム チェックを実行して、アプリが実行されているデバイスに存在する API のみを呼び出していることを確認します。
- 3 番目に、Windows 10の最小バージョンとターゲット バージョンでアプリをテストします。
Visual Studio プロジェクトを構成する
複数のWindows 10バージョンをサポートする最初の手順は、Visual Studio プロジェクトでサポートされている OS/SDK バージョン> Target と Minimum を指定することです。
- Target: Visual Studioがアプリコードをコンパイルし、すべてのツールを実行するSDKバージョン。 この SDK バージョンのすべての API とリソースは、コンパイル時にアプリ コードで使用できます。
- Minimum: アプリが実行できる最も古い OS バージョン(ストアによってデプロイされる)に対応する SDK バージョンと、アプリ マークアップ コードをコンパイルするバージョンとしてVisual StudioがサポートするSDKバージョン。
実行時にアプリはデプロイ先の OS バージョンに対して実行されるため、リソースを使用するか、そのバージョンで使用できない API を呼び出すと、アプリは例外をスローします。 ランタイム チェックを使用して、この記事の後半で正しい API を呼び出す方法について説明します。
[ターゲット] と [最小] の設定では、OS/SDK のバージョンの範囲の末尾を指定します。 ただし、最小バージョンでアプリをテストする場合は、最小バージョンとターゲットバージョンの間の任意のバージョンでアプリが実行されることを確認できます。
ヒント
Visual Studioでは、API の互換性に関する警告は表示されません。 最小バージョンとターゲットバージョンの間および対象を含むすべての OS バージョンでアプリが期待どおりに動作することをテストし、確認するのはユーザーの責任です。
Visual Studio 2015 Update 2 以降で新しいプロジェクトを作成すると、アプリでサポートされるターゲット バージョンと最小バージョンを設定するように求められます。 既定では、ターゲット バージョンはインストールされている SDK のバージョンが最も高く、最小バージョンはインストールされている SDK の最小バージョンです。 [ターゲット] と [最小] は、コンピューターにインストールされている SDK バージョンからのみ選択できます。
通常は既定値のままにすることをお勧めします。 ただし、プレビュー バージョンの SDK がインストールされていて、運用コードを記述している場合は、ターゲット バージョンをプレビュー SDK から最新の公式 SDK バージョンに変更する必要があります。
Visual Studioで既に作成されているプロジェクトの最小バージョンとターゲット バージョンを変更するには、Project -> Properties -> Application タブ -> Targeting に移動します。
参考までに、次の表に各 SDK のビルド番号を示します。
| フレンドリーな名前 | バージョン | OS/SDK ビルド |
|---|---|---|
| RTM | 1507 | 10240 |
| 11 月の更新 | 1511 | 10586 |
| 周年記念アップデート | 1607 | 14393 |
| クリエイターズアップデート | 1703 | 15063 |
| Fall Creators Update | 1709 | 16299 |
| 2018 年 4 月の更新プログラム | 1803 | 17134 |
| 2018 年 10 月の更新 | 1809 | 17763 |
| 2019 年 5 月の更新プログラム | 1903 | 18362 |
Windows SDK およびエミュレーター アーカイブから、リリースされた任意のバージョンの SDK をダウンロードできます。 最新の Windows Insider Preview SDK は、Windows Insider サイトの開発者セクションからダウンロードできます。
Windows 10更新プログラムの詳細については、「Windows 10 リリース情報」を参照してください。 Windows 10 サポート ライフサイクルに関する重要な情報については、Windows ライフサイクルファクト シートを参照してください。
API チェックを実行する
アダプティブ アプリのバージョン管理の鍵となるのは、API コントラクトと ApiInformation クラスの組み合わせです。 このクラスを使用すると、指定した API コントラクト、型、またはメンバーが存在するかどうかを検出できるため、さまざまなデバイスと OS バージョンにわたって API 呼び出しを安全に行うことができます。
API コントラクト
デバイス ファミリ内の API のセットは、API コントラクトと呼ばれる下位区分に分割されます。 ApiInformation.IsApiContractPresent メソッドを使用して、API コントラクトの存在をテストできます。 これは、すべて同じバージョンの API コントラクトに存在する多数の API の存在をテストする場合に便利です。
bool isScannerDeviceContract_1_Present =
Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent
("Windows.Devices.Scanners.ScannerDeviceContract", 1);
API コントラクトとは 基本的に、API コントラクトは機能を表します。これは、関連する API のセットであり、一緒に特定の機能を提供します。 架空の API コントラクトは、2 つのクラス、5 つのインターフェイス、1 つの構造体、2 つの列挙型などを含む API のセットを表します。
論理的に関連する型は API コントラクトにグループ化され、Windows 10以降では、すべてのWindows ランタイム API が一部の API コントラクトのメンバーになります。 API Contracts を使用すると、デバイス上の特定の機能または API の可用性を確認し、特定のデバイスまたは OS をチェックするのではなく、デバイスの機能を効果的にチェックします。 API コントラクト内の任意の API を実装するプラットフォームは、その API コントラクト内のすべての API を実装するために必要です。 つまり、実行中の OS が特定の API コントラクトをサポートしているかどうかをテストし、サポートされている場合は、各 API コントラクトを個別に確認せずに、その API コントラクト内の API のいずれかを呼び出すことができます。
最も大きく、最も一般的に使用される API コントラクトは、Windowsです。Foundation.UniversalApiContract。 これには、ユニバーサル Windows プラットフォームの API の大部分が含まれています。 デバイス ファミリ拡張 SDK と API コントラクトに関するドキュメントでは、使用可能なさまざまな API コントラクトについて説明しています。 そのほとんどは、機能的に関連する API のセットを表していることがわかります。
注
まだ文書化されていないプレビュー Windowsソフトウェア開発キット (SDK) がインストールされている場合は、'(Program Files (x86)))\Windows Kits\10\Platforms<platform><SDK version>\Platform.xml' の SDK インストール フォルダーにある 'Platform.xml' ファイルに API コントラクトのサポートに関する情報も確認できます。
バージョン対応コードと条件付きXAML
Windows 10のすべてのバージョンで、コード内の条件で ApiInformation クラスを使用して、呼び出す API の存在をテストできます。 アダプティブ コードでは、IsTypePresent、IsEventPresent、IsMethodPresent、IsPropertyPresent など、クラスのさまざまなメソッドを使用して、必要な粒度で API をテストできます。
詳細と例については、「 バージョン アダプティブ コード」を参照してください。
アプリの最小バージョンがビルド 15063 (Creators Update) 以降の場合は、 条件付き XAML を使用してプロパティを設定し、コード ビハインドを使用せずにマークアップ内のオブジェクトをインスタンス化できます。 条件付き XAML は、マークアップで ApiInformation.IsApiContractPresent メソッドを使用する方法を提供します。
詳細と例については、「 条件付き XAML」を参照してください。
遅延読み込み API
QueryOptionalDelayLoadedAPI 関数を使用すると、ポリシーにより LoadLibrary を呼び出すことが許可されていない Store アプリでも、実際に遅延読み込みされた関数が見つかったかどうかを検出できるようになります。
#include <windows.h>
#include <commdlg.h>
#include <libloaderapi2.h>
#include <stdio.h>
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HMODULE_THISCOMPONENT reinterpret_cast<HMODULE>(&__ImageBase)
int __cdecl main(int argc, char** argv)
{
if (QueryOptionalDelayLoadedAPI(HMODULE_THISCOMPONENT,
"comdlg32.dll", "GetOpenFileNameW", 0))
{
printf("GetOpenFileNameW can be called!\n");
}
return 0;
}
自分のバージョン アダプティブ アプリをテストする
バージョン アダプティブ コードまたは条件付き XAML を使用してバージョン アダプティブ アプリを記述する場合は、最小バージョンを実行しているデバイスと、ターゲット バージョンのWindows 10を実行しているデバイスでテストする必要があります。
1 つのデバイスですべての条件付きコード パスをテストすることはできません。 すべてのコード パスがテストされていることを確認するには、サポートされている最小バージョンの OS を実行しているリモート デバイス (または仮想マシン) にアプリをデプロイしてテストする必要があります。 リモート デバッグの詳細については、「 UWP アプリの展開とデバッグ」を参照してください。
関連資料
- UWP アプリとは