Межпроцессное взаимодействие (IPC)

В этом разделе описаны различные способы взаимодействия между приложениями универсальная платформа Windows (UWP) и приложениями Win32.

Услуги для приложений

Службы приложений позволяют приложениям предоставлять службы, принимаюющие и возвращающие пакеты свойств примитивов (ValueSet) в фоновом режиме. Расширенные объекты можно передавать, если они сериализуются.

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

Службы приложений лучше всего используются для совместного использования небольших объемов данных, в которых не требуется задержка в режиме реального времени.

COM

COM — это распределенная объектно-ориентированная система для создания двоичных компонентов программного обеспечения, которые могут взаимодействовать и взаимодействовать. Разработчик использует COM для создания повторно используемых компонентов программного обеспечения и уровней автоматизации для приложения. Компоненты COM могут находиться в процессе или вне процесса, и они могут взаимодействовать с помощью клиентской и серверной модели. Внепроцессные COM-серверы уже давно используются в качестве средства для обмена данными между объектами.

Упакованные приложения с возможностью runFullTrust могут регистрировать серверы COM вне процесса для IPC через манифест пакета. Это называется packaged COM.

Файловая система

BroadFileSystemAccess

Упакованные приложения могут выполнять IPC с помощью широкой файловой системы, объявляя ограниченную функцию broadFileSystemAccess . Эта возможность предоставляет Windows.служба хранилища API и API xxxFromApp Win32 обращаются к широкой файловой системе.

По умолчанию IPC через файловую систему для упакованных приложений ограничен другими механизмами, описанными в этом разделе.

PublisherCacheFolder

PublisherCacheFolder позволяет упакованным приложениям объявлять папки в манифесте, к которым можно предоставить общий доступ другим пакетам того же издателя.

Общая папка хранилища имеет следующие требования и ограничения:

  • Данные в общей папке хранилища не резервируются или перемещаются.
  • Пользователь может очистить содержимое общей папки хранилища.
  • Общую папку хранилища нельзя использовать для совместного использования данных между приложениями из разных издателей.
  • Вы не можете использовать общую папку хранилища для совместного использования данных между разными пользователями.
  • В общей папке хранилища нет управления версиями.

Если вы публикуете несколько приложений и ищете простой механизм для обмена данными между ними, то PublisherCacheFolder — это простой вариант на основе файловой системы.

SharedAccess служба хранилища Manager

SharedAccess служба хранилища Manager используется вместе со службами приложений, активациями протокола (например, LaunchUriForResultsAsync) и т. д., чтобы совместно использовать служба хранилища Files с помощью маркеров.

FullTrustProcessLauncher

Благодаря возможности runFullTrust упакованные приложения могут запускать процессы полного доверия в одном пакете.

В сценариях, когда ограничения пакетов являются бременем или отсутствуют варианты IPC, приложение может использовать процесс полного доверия в качестве прокси-сервера для взаимодействия с системой, а затем IPC с процессом полного доверия через службы приложений или другой хорошо поддерживаемый механизм IPC.

LaunchUriForResultsAsync

LaunchUriForResultsAsync используется для простого обмена данными (ValueSet) с другими упакованными приложениями, реализующими контракт активации ProtocolForResults . В отличие от служб приложений, которые обычно выполняются в фоновом режиме, целевое приложение запускается на переднем плане.

Файлы можно совместно использовать, передав общие служба хранилища AccessManager маркеры приложению через ValueSet.

Замыкание на себя

Loopback — это процесс взаимодействия с сетевым сервером, прослушивающим localhost (адрес обратного цикла).

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

  • Все упакованные приложения, участвующие в соединениях с циклом, должны объявить privateNetworkClientServer возможность в манифестах пакета.
  • Два упакованных приложения могут взаимодействовать через loopback, объявив LoopbackAccessRules в манифестах пакета.
    • Каждое приложение должно перечислить другое в loopbackAccessRules. Клиент объявляет правило out для сервера, а сервер объявляет правила in для поддерживаемых клиентов.

Примечание.

Имя семейства пакетов, необходимое для идентификации приложения в этих правилах, можно найти с помощью редактора манифеста пакета в Visual Studio во время разработки, через Центр партнеров для приложений, опубликованных через Microsoft Store, или с помощью команды Get-AppxPackage PowerShell для уже установленных приложений.

Непакованные приложения и службы не имеют удостоверения пакета, поэтому их нельзя объявить в LoopbackAccessRules. Вы можете настроить упакованое приложение для подключения через loopback с распакованными приложениями и службами с помощью CheckNetIsolation.exe, однако это возможно только для неопубликованных или отладки сценариев, где у вас есть локальный доступ к компьютеру, и у вас есть права администратора.

  • Все упакованные приложения, участвующие в соединениях с циклом, должны объявить privateNetworkClientServer возможность в манифестах пакета.
  • Если упакованое приложение подключается к распаковке приложения или службы, выполните команду CheckNetIsolation.exe LoopbackExempt -a -n=<PACKAGEFAMILYNAME> , чтобы добавить исключение обратного цикла для упаковаемого приложения.
  • Если распаковка приложения или службы подключается к упаковаированному приложению, выполните команду CheckNetIsolation.exe LoopbackExempt -is -n=<PACKAGEFAMILYNAME> , чтобы разрешить пакетированному приложению получать входящие подключения к циклу.
    • CheckNetIsolation.exe должен работать непрерывно, пока упакованое приложение прослушивает подключения.
    • Флаг -is появился в Windows 10 версии 1607 (10.0; Сборка 14393).

Примечание.

Имя семейства пакетов, необходимое для -n флага CheckNetIsolation.exe , можно найти с помощью редактора манифеста пакета в Visual Studio во время разработки, через Центр партнеров для приложений, опубликованных через Microsoft Store, или с помощью команды Get-AppxPackage PowerShell для уже установленных приложений.

CheckNetIsolation.exe также полезно для отладки проблем с сетевой изоляцией.

Каналы

Каналы обеспечивают простой обмен данными между сервером канала и одним или несколькими клиентами канала.

Анонимные каналы и именованные каналы поддерживаются со следующими ограничениями:

  • По умолчанию именованные каналы в упакованных приложениях поддерживаются только между процессами в одном пакете, если процесс не является полным доверием.
  • Именованные каналы можно совместно использовать между пакетами, следуя рекомендациям по совместному использованию именованных объектов.
  • Именованные каналы (в упакованных и распакованных приложениях) должны использовать синтаксис \\.\pipe\LOCAL\ для имени канала.

Реестр

Использование реестра для IPC обычно не рекомендуется, но поддерживается для существующего кода. Упакованные приложения могут получить доступ только к разделам реестра, к которым у них есть разрешение на доступ.

Как правило, упакованные классические приложения (см . статью "Создание пакета MSIX из кода") используют виртуализацию реестра, так что глобальный реестр записывается в частный куст в пакете MSIX. Это обеспечивает совместимость исходного кода при минимизации влияния глобального реестра и может использоваться для IPC между процессами в одном пакете. Если вы должны использовать реестр, эта модель предпочтительна и управляет глобальным реестром.

RPC

RPC можно использовать для подключения упаковаемого приложения к конечной точке RPC Win32, если упаковаемое приложение имеет правильные возможности для сопоставления списков управления доступом на конечной точке RPC.

Пользовательские возможности позволяют OEM и IHV определять произвольные возможности, ACL своих конечных точек RPC с ними, а затем предоставлять эти возможности авторизованным клиентским приложениям. Полный пример приложения см. в примере CustomCapability .

Конечные точки RPC также могут быть acled для определенных упакованных приложений, чтобы ограничить доступ к конечной точке только тем приложениям, не требуя затрат на управление пользовательскими возможностями. Api DeriveAppContainerSidFromAppContainerName можно использовать для получения идентификатора безопасности из имени семейства пакетов, а затем ACL конечной точки RPC с идентификатором безопасности, как показано в примере CustomCapability.

Общая память

Сопоставление файлов можно использовать для совместного использования файла или памяти между двумя или несколькими процессами со следующими ограничениями:

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

Общая память рекомендуется эффективно совместно использовать и управлять большими объемами данных.