動的依存関係 API を使用して、実行時にフレームワーク パッケージを参照する

"動的依存関係 API" を使用すると、パッケージ化されていないアプリで、WinUI 2 や DirectX ランタイムなどのフレームワーク パッケージを参照して使用できるようになります。 フレームワーク パッケージの依存関係の詳細については、「MSIX フレームワーク パッケージと動的依存関係」を参照してください。

具体的には、動的依存関係 API を使用すると、フレームワーク パッケージの "インストール時参照" と "実行時参照" を管理できます。 これらの種類の参照の詳細については、「フレームワーク パッケージのサービス モデル」を参照してください。

Note

他のフレームワーク パッケージとは異なり、動的依存関係 API を使用して、パッケージ化されていないアプリで Windows App SDK フレームワーク パッケージを参照することはできません。 代わりに、Windows App SDK に用意されている bootstrapper API を使用する必要があります。 ブートストラップ API は API の特殊な形式であり、Windows App SDK フレームワーク パッケージへの依存関係を取得するように設計されています。 詳細については、「外部の場所でパッケージ化されたアプリまたはパッケージ化されていないアプリの Windows App SDK ランタイムを使用する」を参照してください。

動的依存関係 API を使用する

選択できる動的依存関係 API には、ターゲット プラットフォームとシナリオに応じて、次の 2 つの実装があります。

  • Windows App SDK には、動的依存関係 API を実装する C および C++ 関数 (msixdynamicdependency.h 内) と Windows ランタイム (WinRT) 型 (Microsoft.Windows.ApplicationModel.DynamicDependency 名前空間内) の両方が用意されています。 この API の実装は、Windows 10 バージョン 1809 以降および Windows 11 を対象とするアプリで使用できます。 ただし、いくつかの制限があります。
  • Windows 11 には、動的依存関係 API を実装する C と C++ の関数も用意されています (appmodel.h 内)。 この API の実装は、Windows 11 を対象とするアプリでのみ使用できます。

Note

このトピックで後ほど説明するように、Windows App SDK (C/C++) の API の名前は、Windows 11 (C/C++) の API と同じ名前に Mdd プレフィックスが追加されたものです。 Mdd は、Microsoft Dynamic Dependencies (Microsoft 動的依存関係) の頭文字です。

パッケージ化されていないアプリで動的依存関係 API を使用してフレームワーク パッケージへの依存関係を取得するには、次の一般的なパターン パターンに従います。

1. インストール時参照を作成する

アプリのインストーラーで、またはアプリの最初の実行中に、次の関数またはメソッドのいずれかを呼び出して、使用するフレームワーク パッケージの条件のセットを指定します。 これにより、指定された条件を満たすフレームワーク パッケージにアプリが依存していることがオペレーティング システム (OS) に通知されます。 条件を満たす 1 つ以上のフレームワーク パッケージがインストールされている場合、Windows では、インストール時参照が削除されるまで、これらのフレームワーク パッケージの少なくとも 1 つはインストールされたままになることが保証されます。

指定する条件には、パッケージ ファミリ名、最小バージョン、アーキテクチャが含まれますが、特定のフレームワーク パッケージを指定することはできません。 実行時参照をフレームワーク パッケージに追加すると、API により、指定された条件を満たす最上位バージョンが選択されます。

また、"有効期間成果物" を指定する必要があります。これには、現在のプロセス、ファイル、またはアプリがまだ利用可能であることをシステムに示す Windows レジストリ キーを指定できます。 指定した成果物が存在しなくなった場合、OS では依存関係が不要になったと見なされます。さらに、他のアプリが依存関係を宣言していない場合、フレームワーク パッケージは OS によってアンインストールすることができます。 この機能は、アプリで、アンインストール時にインストール時の PIN の削除を怠るシナリオで役立ちます。

この API によって返される依存関係 ID を、実行時参照を作成したり、インストール時参照を削除したりするための他の呼び出しで、使用する必要があります。

2. 実行時参照を追加する

アプリでフレームワーク パッケージを使用する必要がある場合、次の関数またはメソッドのいずれかを呼び出して、指定されたフレームワーク パッケージへのアクセスを要求し、その実行時参照を追加します。 この API を呼び出すと、フレームワーク パッケージがアクティブに使用されていることと、バージョンの更新を並列で処理することが OS に通知されます (アプリでの使用が完了するまで、古いバージョンのアンインストールまたはサービスを効果的に遅らせます)。 成功した場合、アプリによってクラスがアクティブ化され、フレームワーク パッケージのコンテンツが使用される可能性があります。

この API を呼び出す場合、インストール時参照を作成したときに返された依存関係 ID と、プロセスのパッケージ グラフでフレームワーク パッケージに使用したいランクを渡す必要があります。 この API により、参照されたフレームワーク パッケージの完全な名前と、アクティブに使用される依存関係を追跡するために使用されるハンドルが返されます。 インストール時参照の作成時に指定した条件を満たす複数のフレームワーク パッケージがインストールされている場合、API により、条件を満たす最も高いバージョンが選択されます。

3. 実行時参照を削除する

アプリでフレームワーク パッケージの使用が完了したら、次の関数またはメソッドのいずれかを呼び出して、実行時参照を削除します。 通常、シャットダウン時にアプリでこの API を呼び出します。 この API により、フレームワーク パッケージの不要なバージョンを削除しても安全であることが OS に通知されます。

この API を呼び出す場合、実行時参照を追加したときに返されたハンドルを渡す必要があります。

4. インストール時参照を削除する

アプリがアンインストールされるときに、次の関数またはメソッドのいずれかを呼び出して、インストール時参照を削除します。 他のアプリに依存関係がない場合、この API により、フレームワーク パッケージを削除しても安全であることが OS に通知されます。

この API を呼び出す場合、インストール時参照を作成したときに返された依存関係 ID を渡す必要があります。

Windows App SDK の動的依存関係 API の制限

Windows App SDK の動的依存関係 API を使用してフレームワーク パッケージへの依存関係を取得する場合、この API では、フレームワーク パッケージが使用中であることを Windows に通知し、使用中にフレームワークのサービスをブロックするために、別のインストールされているパッケージと実行中のプロセスによる支援が必要です。 これは、"有効期間マネージャー" と呼ばれます。

フレームワーク パッケージの場合は、Windows App SDK により動的依存関係有効期間マネージャー (DDLM) と呼ばれる有効期間マネージャー コンポーネントが提供されます。 ただし、現在、他のフレームワーク パッケージでは、Microsoft と同様の有効期間マネージャー コンポーネントは提供されていません。

Windows 11 の動的依存関係 API の実装 (appmodel.h 内) には、この制限はありません。