次の方法で共有


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

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

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

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

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

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

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

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

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

  • ほとんどの開発者は、動的依存関係を使用して、外部の場所またはパッケージ化されていないアプリでパッケージ化された Windows App SDK フレームワーク パッケージを参照するだけで、アプリは Windows App SDK ランタイムによって提供される API を呼び出すことができます。 そのシナリオの詳細については、「外部の場所でパッケージ化されたアプリ」または「パッケージ化されていないアプリ」に対して Windows App SDK ランタイムを使用する方法について およびを参照してください。
  • 場合によっては、開発者は動的依存関係を使用して、パッケージ化されていないアプリ ( WinUI2 のフレームワーク パッケージや DirectX ランタイムなど) から別のフレームワーク パッケージ (Windows App SDK フレームワーク パッケージ以外) を参照したい場合があります。 このシナリオの詳細については、「 動的依存関係 API を使用して実行時に MSIX パッケージを参照する」を参照してください。

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

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

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 はパッケージ化されたアプリが実行されていることを認識し、新しいアプリが使用可能になったときに使用中のフレームワーク パッケージを削除することを回避します。