Поделиться через


Пакеты платформы MSIX и динамические зависимости

Эта статья содержит важные понятия, связанные с пакетами платформы MSIX. Сведения из этой статьи предоставляют полезный контекст, позволяющий лучше понять структуру и назначение функции динамических зависимостей в пакете SDK для приложений Windows и в операционной системе Windows 11. Эта функция позволяет приложениям ссылаться на пакеты платформы MSIX и использовать их во время выполнения.

Пакеты платформы и граф пакетов

MSIX — это формат пакета, который предоставляет современные возможности упаковки и развертывания. Он также предоставляет понятный и надежный способ упаковки распространяемых библиотек, содержимого и компонентов с помощью пакетов платформы MSIX. Пакет платформы MSIX позволяет упакованным приложениям получать доступ к компонентам через один общий источник на устройстве пользователя, а не объединить их в пакет приложения. К общим пакетам платформы относятся пакет SDK для приложений Windows (включая WinUI3), WinUI2, VCLibs и среда выполнения DirectX.

Начиная с Windows 8 и заканчивая Windows 10 и Windows 11, каждый процесс имеет граф пакета, который предоставляет список всех доступных для приложения пакетов, включая платформу, ресурс, дополнительный и основной пакет. Этот граф позволяет приложению загружать библиотеки DLL, содержимое и объявления класса среды выполнения, предоставляемые пакетом, на который есть ссылка. Ранее этот граф был исправлен во время создания процесса. Изменить его во время выполнения было невозможно:

  • Для упакованных приложений граф был инициализирован на основе зависимостей пакета, объявленных в элементе PackageDependency в манифесте пакета приложения. При создании упакованного приложения это обычно выполнялось во время процесса сборки на основе ссылок и зависимостей проекта.
  • Для распакованных приложений граф пакетов был пустым и не мог быть изменен. Поэтому неупакованные приложения были ограничены стандартным порядком поиска библиотек DLL и не могли получить доступ к пакетам платформы.

Это ограничение статического графа пакетов снято с введением поддержки динамических зависимостей как в пакете SDK для приложений Windows, так и в Windows 11. Разработчики могут использовать динамические зависимости, чтобы ссылаться на пакеты платформы MSIX и использовать их из своих приложений во время выполнения. Динамические зависимости удаляют ограничение статического графа пакетов из приложений. Разработчики могут решить, как они хотят использовать пакеты платформы.

Основные сценарии для динамических зависимостей

Хотя динамические зависимости позволяют любому приложению добавлять зависимость платформы пакетов во время выполнения, эта функция в основном предназначена для использования приложениями, упакованными с внешним расположением или распаковкой приложений. Упакованные приложения по-прежнему могут продолжать добавлять статические зависимости с помощью элемента PackageDependency в своем манифесте пакета.

Модель обслуживания для пакетов платформы

Функция динамических зависимостей сохраняет целостность конвейера обслуживания для пакета платформы, на который имеется ссылка и который используется динамически во время выполнения.

Пакеты платформы MSIX поддерживают обслуживание в параллельной модели, то есть каждая версия устанавливается в отдельной папке, имеющей маркировку версий. Это позволяет используемым приложениям работать даже в том случае, когда новое приложение устанавливает более новую версию пакета платформы. В операционной системе имеется логика для удаления старых версий данного пакета платформы на основе наличия ссылок времени установки и выполнения для пакета.

  • При установке приложения оно может создать ссылку времени установки на пакет платформы. Эта ссылка информирует операционную систему о том, что приложение зависит от указанного пакета платформы, чтобы пакет платформы не был удален во время установки приложения.
  • Если приложению требуется использовать интерфейсы API или содержимое в пакете платформы, можно добавить ссылку времени выполнения на пакет платформы. Эта ссылка информирует операционную систему о том, что пакет платформы активно используется и необходимо выполнить параллельную обработку любых обновлений версий. Если установлена новая версия пакета платформы, но в работающем приложении используется более старая, операционная система не сможет удалить старую версию до тех пор, пока не будут удалены все ссылки времени выполнения на более раннюю версию.

Например, в этом сценарии:

  • Приложение A работает под управлением версии 1.0.0.0 заданного пакета платформы.
  • Приложение Б установлено и зависит от версии 1.0.0.1 того же пакета платформы.

В этом сценарии обе версии пакета платформы будут установлены и использованы приложениями А и Б. Однако когда пользователь закроет и перезагрузит приложение А, оно выберет новую версию 1.0.0.1 пакета платформы. На этом этапе требования ссылки времени выполнения больше не действуют для пакета платформы версии 1.0.0.0, и операционная система может безопасно удалить версию 1.0.0.0. Позже, когда пользователь удаляет приложение А и Б, требование ссылки времени установки становится недействительным и операционная система может полностью удалить пакет платформы.

Для упакованных приложений, использующих элемент PackageDependency , чтобы указать статические ссылки на пакеты платформы, ссылки на время установки для пакетов платформы отслеживаются ОС при установке или удалении приложения. Для ссылок времени выполнения, управляемых с помощью функции динамических зависимостей, операционная система знает, когда упакованное приложение запущено, и не удаляет его используемые пакеты платформы, когда доступна более новая версия.