Packages d’infrastructure MSIX et dépendances dynamiques

Cet article présente des concepts importants liés aux packages d’infrastructure MSIX. Les informations contenues dans cet article donnent un éclairage contextuel utile pour mieux comprendre comment est conçue et à quoi sert la fonctionnalité des dépendances dynamiques dans le SDK d’application Windows et dans le système d’exploitation Windows 11. Cette fonctionnalité permet à vos applications de référencer et d’utiliser des packages d’infrastructure MSIX au moment de l’exécution.

Packages d’infrastructure et graphe de package

MSIX est un format de package qui offre une expérience moderne d’empaquetage et de déploiement. Ce format offre aussi un moyen propre et fiable d’empaqueter des bibliothèques, du contenu et des composants redistribuables par le biais de packages d’infrastructure MSIX. Un package d’infrastructure MSIX permet aux applications empaquetées d’accéder à des composants via une seule source partagée sur l’appareil de l’utilisateur, au lieu de les regrouper dans le package de l’application. Parmi les packages d’infrastructure courants figurent le SDK d’application Windows (y compris WinUI3), WinUI2, VCLibs et le runtime DirectX.

À partir de Windows 8 jusqu’à Windows 10 et Windows 11, chaque processus comporte un graphe de package qui fournit la liste de tous les packages disponibles pour l’application, notamment les packages d’infrastructure, de ressources, facultatifs et principaux. Ce graphe permet à l’application de charger des DLL, du contenu et des déclarations de classe au moment de l’exécution fournis par un package référencé. Historiquement, ce graphe était fixé au moment de la création du processus et il n’existait aucun moyen de le modifier au moment de l’exécution :

  • Pour les applications empaquetées, le graphe était initialisé en fonction des dépendances de package déclarées dans l’élément PackageDependency dans le manifeste du package de l’application. Lors de la génération d’une application empaquetée, cette initialisation était généralement effectuée automatiquement pendant le processus de génération en fonction des références et dépendances du projet.
  • Pour les applications non empaquetées, le graphe du package était vide et ne pouvait pas être modifié. Par conséquent, les applications non empaquetées étaient limitées à l’ordre de recherche des DLL standard et ne pouvaient pas accéder aux packages d’infrastructure.

Cette restriction du graphe de package statique est levée avec l’introduction de la prise en charge des dépendances dynamiques à la fois dans le SDK d’application Windows et dans Windows 11. Les développeurs peuvent utiliser des dépendances dynamiques pour référencer et utiliser des packages d’infrastructure MSIX à partir de leurs applications au moment de l’exécution. Les dépendances dynamiques suppriment la restriction du graphe de package statique dans les applications, et les développeurs peuvent déterminer leur façon d’exploiter des packages d’infrastructure.

Principaux scénarios pour les dépendances dynamiques

Bien que les dépendances dynamiques permettent à toute application d’ajouter une dépendance de package d’infrastructure au moment de l’exécution, cette fonctionnalité est principalement destinée à être utilisée par les applications empaquetées avec un emplacement externe ou par les applications non empaquetées. Les applications empaquetées peuvent toujours continuer à ajouter des dépendances statiques par le biais de l’élément PackageDependency dans leur manifeste du package.

Modèle de service pour les packages d’infrastructure

La fonctionnalité des dépendances dynamiques préserve l’intégrité du pipeline de service pour le package d’infrastructure référencé et utilisé dynamiquement au moment de l’exécution.

Les packages d’infrastructure MSIX prennent en charge le service dans un modèle côte à côte, ce qui signifie que chaque version est installée dans son propre dossier versionné distinct. Les applications en cours d’utilisation peuvent ainsi rester opérationnelles même quand une application plus récente installe une version plus récente du package d’infrastructure. Le système d’exploitation intègre une logique de désinstallation pour déterminer quand supprimer les versions antérieures d’un package d’infrastructure donné, en fonction de la présence de références au moment de l’installation et de références au moment de l’exécution pour le package.

  • Quand une application est installée, elle peut créer une référence au moment de l’installation à un package d’infrastructure. Cette référence indique au système d’exploitation que l’application comporte une dépendance vis-à-vis du package d’infrastructure spécifié, de sorte que ce système d’exploitation ne va pas désinstaller le package d’infrastructure pendant l’installation de votre application.
  • Quand une application a besoin d’utiliser des API ou du contenu dans un package d’infrastructure, elle peut ajouter au package d’infrastructure une référence au moment de l’exécution. Cette référence indique au système d’exploitation que le package d’infrastructure est en cours d’utilisation et qu’il doit gérer les mises à jour de version de manière côte à côte. Si une nouvelle version du package d’infrastructure est installée, alors qu’une application en cours d’exécution utilise une version antérieure, le système d’exploitation ne peut pas supprimer la version antérieure tant que toutes les références au moment de l’exécution à cette version antérieure n’ont pas été supprimées.

Prenons l’exemple de ce scénario :

  • L’application A est en cours d’exécution et utilise la version 1.0.0.0 d’un package d’infrastructure donné.
  • L’application B est installée et comporte une dépendance vis-à-vis de la version 1.0.0.1 du même package d’infrastructure.

Dans ce scénario, les deux versions du package d’infrastructure vont être installées et utilisées par l’application A et l’application B. Néanmoins, quand l’utilisateur ferme l’application A, puis la redémarre, la version la plus récente 1.0.0.1 du package d’infrastructure est sélectionnée. À ce stade, l’exigence de la référence au moment de l’exécution n’est plus valide pour la version 1.0.0.0 du package d’infrastructure et le système d’exploitation peut supprimer sans danger la version 1.0.0.0. Par la suite, quand l’application A et l’application B sont désinstallées par l’utilisateur, l’exigence de la référence au moment de l’installation n’est plus valide et le système d’exploitation peut sans danger supprimer entièrement le package d’infrastructure.

Pour les applications empaquetées qui utilisent l’élément PackageDependency pour spécifier des références statiques à des packages d’infrastructure, les références au moment de l’installation des packages d’infrastructure sont suivies par le système d’exploitation lors de l’installation ou de la désinstallation de l’application. Pour les références au moment de l’exécution gérées à l’aide de la fonctionnalité des dépendances dynamiques, le système d’exploitation sait quand une application incluse dans un package est en cours d’exécution et peut éviter de supprimer ses packages d’infrastructure en cours d’utilisation quand une plus récente est disponible.