Partager via


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 fournissent un contexte utile pour vous aider à mieux comprendre la conception et l’objectif de la fonctionnalité de 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 paquets

MSIX est un format de package qui fournit une expérience moderne d’empaquetage et de déploiement. Il fournit également un moyen propre et fiable de empaqueter des bibliothèques redistribuables, du contenu et des composants via des packages d’infrastructure MSIX. Un package d’infrastructure MSIX permet aux applications empaquetées d’accéder aux composants via une seule source partagée sur l’appareil de l’utilisateur, au lieu de les regrouper dans le package d’application. Les packages d’infrastructure courants incluent le Kit de développement logiciel (SDK) d’application Windows (y compris WinUI3), WinUI2, VCLibs et DirectX Runtime.

À compter de Windows 8 et en continuant via Windows 10 et Windows 11, chaque processus a un graphique de package qui fournit la liste de tous les packages disponibles pour l’application, notamment l’infrastructure, la ressource, les packages facultatifs et principaux. Ce graphique permet à l’application de charger des DLL, du contenu et des déclarations de classe d’exécution fournies par un package référencé. Historiquement, ce graphique a été résolu au moment de la création du processus et il n’y avait aucun moyen de le modifier au moment de l’exécution :

  • Pour les applications empaquetées, le graphique a été 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, cela a généralement été effectué pendant le processus de génération en fonction des références et dépendances de votre projet.
  • Pour les applications non empaquetées, le graphique de package était vide et n’a pas pu être modifié. Par conséquent, les applications non empaquetées étaient limitées à l’ordre de recherche DLL standard et n’ont pas pu accéder aux packages d’infrastructure.

Cette restriction de graphe de package statique est levée avec l’introduction de la prise en charge des dépendances dynamiques 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 éliminent la restriction liée au graphe de dépendances statiques des applications, et les développeurs peuvent décider de la manière dont ils souhaitent tirer parti des packages de framework.

Scénarios principaux pour les dépendances dynamiques

Bien que les dépendances dynamiques permettent à n’importe quelle application d’ajouter une dépendance d’infrastructure de package 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 des applications non empaquetées. Les applications empaquetées peuvent continuer à ajouter des dépendances statiques via l’élément PackageDependency dans leur manifeste de package.

Modèle de maintenance pour les packages d’infrastructure

La fonctionnalité de dépendances dynamiques conserve l’intégrité du pipeline de maintenance 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 la maintenance dans un modèle côte à côte, ce qui signifie que chaque version est installée dans son propre dossier avec version distinct. Cela permet aux applications en cours d’utilisation de rester opérationnelles même lorsqu’une application plus récente installe une version plus récente du package d’infrastructure. Le système d'exploitation dispose d'une logique de désinstallation permettant de déterminer quand supprimer des versions antérieures d'un package de framework donné, basé sur 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.

  • Lorsqu’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 informe le système d’exploitation que l’application a une dépendance sur le package d’infrastructure spécifié afin que le système d’exploitation ne désinstalle pas le package d’infrastructure pendant l’installation de votre application.
  • Lorsqu’une application doit utiliser des API ou du contenu dans un package d’infrastructure, elle peut ajouter une référence au moment de l’exécution au package d’infrastructure. Cette référence informe le système d’exploitation que le package du framework est en cours d’utilisation active et pour gérer toutes les mises à jour de version en parallèle. Si une nouvelle version du package d’infrastructure est installée, mais qu’une application en cours d’exécution a une version antérieure en cours d’utilisation, le système d’exploitation ne peut pas supprimer l’ancienne version tant que toutes les références au moment de l’exécution ne sont pas supprimées.

Par exemple, étant donné 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 a une dépendance avec la version 1.0.0.1 du même package d’infrastructure.

Dans ce scénario, les deux versions du package d’infrastructure seront installées et utilisées par l’application A et l’application B. Toutefois, lorsque l’application A est fermée par l’utilisateur, puis redémarrée, elle récupère la version 1.0.0.1 plus récente du package d’infrastructure. À ce stade, l’exigence de 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 en toute sécurité la version 1.0.0.0. Plus tard, lorsque l’application A et l’application B sont désinstallées par l’utilisateur, l’exigence de référence au moment de l’installation n’est plus valide et il est sûr que le système d’exploitation supprime 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 aux packages d’infrastructure, les références au moment de l’installation des packages d’infrastructure sont suivies par le système d’exploitation lorsque l’application est installée ou désinstallée. Pour les références au moment de l’exécution gérées à l’aide de la fonctionnalité de dépendances dynamiques, le système d’exploitation sait quand une application empaquetée est en cours d’exécution et évite de supprimer ses packages d’infrastructure in-use lorsqu’un nouveau package est disponible.