MSIX フレームワーク パッケージと動的依存関係

この記事では、"MSIX フレームワーク パッケージ" に関連する重要な概念を紹介します。 この記事の情報は、Windows App SDK および Windows 11 OS の "動的依存関係" 機能の設計と目的をより深く理解するために役立つコンテキストを提供します。 この機能により、アプリでは実行時に MSIX フレームワーク パッケージを参照して使用することができます。

フレームワーク パッケージとパッケージ グラフ

MSIX は、最新のパッケージ化および展開エクスペリエンスを提供するパッケージ形式です。 また、"MSIX フレームワーク パッケージ" を介して、再配布可能なライブラリ、コンテンツ、コンポーネントをパッケージ化するためのクリーンで信頼できる方法も提供されます。 MSIX フレームワーク パッケージを使用すると、パッケージ化アプリでは、コンポーネントをアプリ パッケージにバンドルする代わりに、ユーザーのデバイス上にある単一の共有リソースを介してコンポーネントにアクセスできます。 共通フレームワーク パッケージには、Windows App SDK (WinUI3 を含む)、WinUI2VCLibs、DirectX ランタイムが含まれます。

Windows 8 から Windows 10 および Windows 11 まで、すべてのプロセスには "パッケージ グラフ" があり、フレームワーク、リソース、オプション、メイン パッケージなど、アプリで利用できるすべてのパッケージの一覧が提供されます。 このグラフにより、アプリでは、参照されたパッケージによって提供される DLL、コンテンツ、ランタイム クラス宣言を読み込むことができます。 従来、このグラフはプロセスの作成時に修正されており、実行時に変更することはできませんでした。

  • パッケージ化アプリの場合、グラフは、アプリのパッケージ マニフェストの PackageDependency 要素で宣言されたパッケージの依存関係に基づいて初期化されていました。 パッケージ化されたアプリをビルドする場合、通常、これは、ビルド プロセス中に、プロジェクトの参照と依存関係に基づいて行われていました。
  • パッケージ化されていないアプリの場合、パッケージ グラフは空で、変更できませんでした。 そのため、パッケージ化されていないアプリは、標準の DLL 検索順序に制限され、フレームワーク パッケージにアクセスできませんでした。

Windows App SDK と Windows 11 の両方において動的依存関係のサポートが導入されたことで、この静的なパッケージ グラフの制限がなくなりました。 開発者は、動的依存関係を使用して、実行時にアプリから MSIX フレームワーク パッケージを参照して使用できます。 動的依存関係により、静的なパッケージ グラフの制限がアプリから取り除かれるため、開発者は、希望するフレームワーク パッケージの活用方法を決定できます。

動的依存関係の主なシナリオ

動的依存関係により、どのアプリでも実行時にパッケージ フレームワークの依存関係を追加できますが、この機能は主に、外部の場所でパッケージ化されたアプリまたはパッケージ化されていないアプリで使用することを目的としています。 パッケージ化されたアプリでは引き続き、パッケージ マニフェストの PackageDependency 要素を介して静的な依存関係を追加できます。

フレームワーク パッケージのサービス モデル

動的依存関係機能により、実行時に動的に参照および使用されるフレームワーク パッケージのサービス パイプラインの整合性が維持されます。

MSIX フレームワーク パッケージでは、サイド バイ サイド モデルでのサービスがサポートされています。つまり、各バージョンは、バージョン管理された個別のフォルダーにインストールされます。 これにより、新しいアプリで新しいバージョンのフレームワーク パッケージがインストールされた場合でも、使用中のアプリケーションを稼働させ続けることができます。 OS には、パッケージの "インストール時参照" および "実行時参照" の有無に基づいて、特定のフレームワーク パッケージの古いバージョンを削除するタイミングに関するアンインストール ロジックがあります。

  • アプリがインストールされると、フレームワーク パッケージへの "インストール時参照" を作成できます。 この参照によって、アプリが指定されたフレームワーク パッケージに依存していることが OS に通知され、アプリのインストール中に OS によってフレームワーク パッケージがアンインストールされないようにします。
  • アプリがフレームワーク パッケージ内の API またはコンテンツを使用する必要がある場合、フレームワーク パッケージへの "実行時参照" を追加できます。 この参照によって、フレームワーク パッケージがアクティブに使用されていること、およびバージョンの更新を並列で処理することが OS に通知されます。 フレームワーク パッケージの新しいバージョンがインストールされているが、実行中のアプリで古いバージョンが使用されている場合、OS では、古いバージョンへの実行時参照がすべて削除されるまで、古いバージョンを削除できません。

たとえば、次のシナリオについて考えてみましょう。

  • アプリ A が実行されており、特定のフレームワーク パッケージのバージョン 1.0.0.0 を使用しています。
  • アプリ B がインストールされており、同じフレームワーク パッケージのバージョン 1.0.0.1 に依存しています。

このシナリオでは、フレームワーク パッケージの両方のバージョンがインストールされ、アプリ Aアプリ B によって使用されます。ただし、アプリ A がユーザーによって閉じられ、再起動されると、フレームワーク パッケージの新しいバージョン 1.0.0.1 が取得されます。 この時点で、フレームワーク パッケージのバージョン 1.0.0.0 に対する実行時参照の要件は無効になり、OS ではバージョン 1.0.0.0 を安全に削除できます。 この後、アプリ Aアプリ B がユーザーによってアンインストールされると、インストール時参照の要件は無効になり、OS ではフレームワーク パッケージ全体を安全に削除できます。

PackageDependency 要素を使用してフレームワーク パッケージへの静的参照を指定するパッケージ化アプリの場合、フレームワーク パッケージのインストール時参照は、アプリのインストールまたはアンインストール時に OS によって追跡されます。 動的依存関係機能を使用して管理される実行時参照の場合、OS は、パッケージ化されたアプリがいつ実行されているかを認識し、新しいフレームワークパッケージが利用可能になっても、使用中のフレームワークパッケージを削除しないようにします。