Создание размещенных приложенийCreate hosted apps

Начиная с Windows 10 версии 2004, можно создавать размещенные приложения.Starting in Windows 10, version 2004, you can create hosted apps. Размещенное приложение использует тот же исполняемый файл и определение, что и родительское ведущее приложение, но выглядит и ведет себя как отдельное приложение в системе.A hosted app shares the same executable and definition as a parent host app, but it looks and behaves like a separate app on the system.

Размещенные приложения полезны в сценариях, где требуется, чтобы компонент (например, исполняемый файл или файл сценария) работал как автономное приложение Windows 10, но для работы компонента требуется процесс узла.Hosted apps are useful for scenarios where you want a component (such as an executable file or a script file) to behave like a standalone Windows 10 app, but the component requires a host process in order to execute. Например, сценарий PowerShell или Python можно доставить как размещенное приложение, для выполнения которого требуется установка узла.For example, a PowerShell or Python script could be delivered as a hosted app that requires a host to be installed in order to run. Размещенное приложение может иметь собственные плитку начального экрана, удостоверение и глубокую интеграцию с такими компонентами Windows 10, как фоновые задачи, уведомления, плитки и получатели данных.A hosted app can have its own start tile, identity, and deep integration with Windows 10 features such as background tasks, notifications, tiles, and share targets.

Функция размещенных приложений поддерживается несколькими элементами и атрибутами в манифесте пакета, которые позволяют размещенному приложению использовать исполняемый файл и определение в пакете ведущего приложения.The hosted apps feature is supported by several elements and attributes in the package manifest that enable a hosted app to use an executable and definition in a host app package. Когда пользователь запускает размещенное приложение, операционная система автоматически запускает исполняемый файл узла с удостоверением размещенного приложения.When a user runs the hosted app, the OS automatically launches the host executable under the identity of the hosted app. Узел может загружать визуальные ресурсы, содержимое или вызывать API в качестве размещенного приложения.The host can then load visual assets, content, or call APIs as the hosted app. Размещенное приложение получает пересечение возможностей, объявленных между узлом и размещенным приложением.The hosted app gets the intersection of capabilities declared between the host and hosted app. Это означает, что размещенное приложение не может запросить больше возможностей, чем предоставляет узел.This means that a hosted app cannot ask for more capabilities than what the host provides.

Определение узлаDefine a host

Узел — это основной исполняемый файл или процесс среды выполнения для размещенного приложения.The host is the main executable or runtime process for the hosted app. В настоящее время единственными поддерживаемыми узлами являются классические приложения (.NET или C++/Win32), имеющие удостоверение пакета.Currently, the only supported hosts are desktop apps (.NET or C++/Win32) that have package identity. В настоящее время приложения UWP не поддерживаются как узлы.UWP apps are not supported as hosts at this time. Существует несколько способов, с помощью которых классическое приложение имеет удостоверение пакета:There are several ways for a desktop app to have package identity:

  • Самый распространенный способ предоставить удостоверение пакета для классического приложения — упаковать его в пакет MSIX.The most common way to grant package identity to a desktop app is by packaging it in an MSIX package.
  • В некоторых случаях вы можете предоставить удостоверение пакета, создав разреженный пакет.In some cases, you may alternatively choose to grant package identity by creating a sparse package. Этот параметр полезен, если не удается внедрить MSIX упаковку для развертывания классического приложения.This option is useful if you are unable to adopt MSIX packaging for deploying your desktop app.

Узел объявляется в манифесте пакета с помощью расширения uap10: хострунтиме .The host is declared in its package manifest by the uap10:HostRuntime extension. Это расширение имеет атрибут ID , которому необходимо присвоить значение, на которое также ссылается манифест пакета для размещенного приложения.This extension has an Id attribute that must be assigned a value that is also referenced by the package manifest for the hosted app. Когда размещенное приложение активируется, узел запускается по идентификатору размещенного приложения и может загружать содержимое или двоичные файлы из пакета размещенного приложения.When the hosted app is activated, the host is launched under the identity of the hosted app and can load content or binaries from the hosted app package.

В следующем примере показано, как определить узел в манифесте пакета.The following example demonstrates how to define a host in a package manifest. Расширение uap10: хострунтиме является частью всего пакета и, следовательно, объявлено как дочерний элемент пакета .The uap10:HostRuntime extension is package-wide and is therefore declared as a child of the Package element.

<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">

  <Extensions>
    <uap10:Extension Category="windows.hostRuntime"  
        Executable="PyScriptEngine\PyScriptEngine.exe"  
        uap10:RuntimeBehavior="packagedClassicApp"  
        uap10:TrustLevel="mediumIL">
      <uap10:HostRuntime Id="PythonHost" />
    </uap10:Extension>
  </Extensions>

</Package>

Запишите эти важные сведения о следующих элементах.Make note of these important details about the following elements.

ЭлементElement СведенияDetails
uap10:Extensionuap10:Extension windows.hostRuntimeКатегория объявляет расширение для всего пакета, которое определяет сведения среды выполнения, используемые при активации размещенного приложения.The windows.hostRuntime category declares a package-wide extension that defines the runtime information to be used when activating a hosted app. Размещенное приложение будет выполняться с определениями, объявленными в расширении.A hosted app will run with the definitions declared in the extension. При использовании ведущего приложения, объявленного в предыдущем примере, размещенное приложение будет выполняться как исполняемый PyScriptEngine.exe на уровне доверия медиумил .When using the host app declared in the previous example, a hosted app will run as the executable PyScriptEngine.exe at the mediumIL trust level.

Атрибуты исполняемого файла, uap10: рунтимебехавиори uap10: TrustLevel указывают имя двоичного процесса хоста в пакете и то, как будут выполняться размещенные приложения.The Executable, uap10:RuntimeBehavior, and uap10:TrustLevel attributes specify the name of the host process binary in the package and how the hosted apps will run. Например, размещенное приложение, использующее атрибуты из предыдущего примера, будет выполняться как исполняемый PyScriptEngine.exe на уровне доверия Медиумил.For example, a hosted app using the attributes in the previous example will run as the executable PyScriptEngine.exe at mediumIL trust level.
uap10:HostRuntimeuap10:HostRuntime Атрибут ID объявляет уникальный идентификатор этого конкретного ведущего приложения в пакете.The Id attribute declares the unique identifier of this specific host app in the package. Пакет может иметь несколько ведущих приложений, каждый из которых должен иметь элемент uap10: хострунтиме с уникальным идентификатором.A package can have multiple host apps, and each must have a uap10:HostRuntime element with a unique Id.

Объявление размещенного приложенияDeclare a hosted app

Размещенное приложение объявляет зависимость пакета на узле.A hosted app declares a package dependency on a host. Размещенное приложение использует идентификатор узла (то есть атрибут ID расширения uap10: хострунтиме в пакете узла) для активации вместо указания исполняемого файла точки входа в собственном пакете.The hosted app leverages the host's ID (that is, the Id attribute of the uap10:HostRuntime extension in the host package) for activation instead of specifying an entry point executable in its own package. Размещенное приложение обычно содержит содержимое, визуальные ресурсы, скрипты или двоичные файлы, к которым может получить доступ узел.The hosted app typically contains content, visual assets, scripts, or binaries that may be accessed by the host. Значение TargetDeviceFamily в размещенном пакете приложения должно указывать на то же значение, что и узел.The TargetDeviceFamily value in the hosted app package should target the same value as the host.

Пакеты размещенных приложений могут быть подписаны или не подписаны:Hosted app packages can be signed or unsigned:

  • Подписанные пакеты могут содержать исполняемые файлы.Signed packages may contain executable files. Это полезно в сценариях с механизмом двоичного расширения, который позволяет узлу загружать библиотеку DLL или зарегистрированный компонент в пакете размещенного приложения.This is useful in scenarios that have a binary extension mechanism, which enables the host to load a DLL or registered component in the hosted app package.
  • Неподписанные пакеты могут содержать только неисполняемые файлы.Unsigned packages can only contain non-executable files. Это полезно в тех случаях, когда узлу требуется только загрузка изображений, ресурсов и содержимого или файлов скриптов.This is useful in scenarios where the host only needs to load images, assets and content or script files. Неподписанные пакеты должны включать в себя специальное OID значение в элементе Identity , иначе они не смогут регистрироваться.Unsigned packages must include a special OID value in their Identity element or they won’t be allowed to register. Это предотвращает конфликт неподписанных пакетов с или подмену удостоверения подписанного пакета.This prevents unsigned packages from conflicting with or spoofing the identity of a signed package.

Чтобы определить размещенное приложение, объявите в манифесте пакета следующие элементы:To define a hosted app, declare the following items in the package manifest:

В следующем примере показаны соответствующие разделы манифеста пакета для неподписанного размещенного приложения.The following example demonstrates the relevant sections of a package manifest for an unsigned hosted app.

<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">

  <Identity Name="NumberGuesserManifest"
    Publisher="CN=AppModelSamples, OID.2.25.311729368913984317654407730594956997722=1"
    Version="1.0.0.0" />

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
    <uap10:HostRuntimeDependency Name="PyScriptEnginePackage" Publisher="CN=AppModelSamples" MinVersion="1.0.0.0"/>
  </Dependencies>

  <Applications>
    <Application Id="NumberGuesserApp"  
      uap10:HostId="PythonHost"  
      uap10:Parameters="-Script &quot;NumberGuesser.py&quot;">
    </Application>
  </Applications>

</Package>

Запишите эти важные сведения о следующих элементах.Make note of these important details about the following elements.

ЭлементElement СведенияDetails
ИдентификацияIdentity Так как пакет размещенного приложения в этом примере не подписан, атрибут издателя должен содержать OID.2.25.311729368913984317654407730594956997722=1 строку.Because the hosted app package in this example is unsigned, the Publisher attribute must include the OID.2.25.311729368913984317654407730594956997722=1 string. Это гарантирует, что неподписанный пакет не сможет подменить удостоверение подписанного пакета.This ensures that the unsigned package cannot spoof the identity of a signed package.
TargetDeviceFamilyTargetDeviceFamily Атрибут MinVersion должен указывать 10.0.19041.0 или более ПОЗДНЮЮ версию ОС.The MinVersion attribute must specify 10.0.19041.0 or a later OS version.
uap10:HostRuntimeDependencyuap10:HostRuntimeDependency Этот элемент объявляет зависимость от пакета главного приложения.This element element declares a dependency on the host app package. Это состоит из имени и издателя пакета узла и набора MinVersion , от которого он зависит.This consists of the Name and Publisher of the host package, and the MinVersion it depends on. Эти значения можно найти в элементе Identity в пакете узла.These values can be found under the Identity element in the host package.
ПриложениеApplication Атрибут uap10: HostID выражает зависимость от узла.The uap10:HostId attribute expresses the dependency on the host. Пакет размещенного приложения должен объявлять этот атрибут вместо обычных атрибутов исполняемого файла и точки входа для элемента приложения или расширения .The hosted app package must declare this attribute instead of the usual Executable and EntryPoint attributes for an Application or Extension element. В результате размещенное приложение наследует атрибуты исполняемого файла, точки входа и среды выполнения от узла с соответствующим значением HostID .As a result, the hosted app inherits the Executable, EntryPoint and runtime attributes from the host with the corresponding HostId value.

Атрибут uap10: Parameters задает параметры, которые передаются в функцию точки входа исполняемого объекта узла.The uap10:Parameters attribute specifies parameters that are passed to the entry point function of the host executable. Поскольку ведущему приложению необходимо узнать, что делать с этими параметрами, существует подразумеваемый контракт между узлом и размещенным приложением.Because the host needs to know what to do with these parameters, there is an implied contract between the host and hosted app.

Регистрация пакета неподписанного размещенного приложения во время выполненияRegister an unsigned hosted app package at run time

Одно из преимуществ расширения uap10: хострунтиме заключается в том, что оно позволяет узлу динамически создавать размещенный пакет приложения во время выполнения и регистрировать его с помощью API PackageManager , не требуя подписывать его.One benefit of the uap10:HostRuntime extension is that it enables a host to dynamically generate a hosted app package at runtime and register it by using the PackageManager API, without needing to sign it. Это позволяет узлу динамически создавать содержимое и манифест для размещенного пакета приложения, а затем регистрировать его.This enables a host to dynamically generate the content and manifest for the hosted app package and then register it.

Используйте следующие методы класса PackageManager для регистрации неподписанного пакета размещенного приложения.Use the following methods of the PackageManager class to register an unsigned hosted app package. Эти методы доступны начиная с Windows 10 версии 2004.These methods are available starting in Windows 10, version 2004.

  • Аддпаккажебюриасинк: регистрирует неподписанный пакет MSIX с помощью свойства алловунсигнед параметра Options .AddPackageByUriAsync: Registers an unsigned MSIX package by using the AllowUnsigned property of the options parameter.
  • Регистерпаккажебюриасинк: выполняет нежесткую регистрацию файла манифеста пакета.RegisterPackageByUriAsync: Performs a loose package manifest file registration. Если пакет подписан, то папка, содержащая манифест, должна включать p7x- файл и каталог.If the package is signed, the folder containing the manifest must include a .p7x file and catalog. Если значение не подписано, должно быть задано свойство алловунсигнед параметра Options .If unsigned, the AllowUnsigned property of the options parameter must be set.

Требования к неподписанным размещенным приложениямRequirements for unsigned hosted apps

  • Элементы приложения или расширения в манифесте пакета не могут содержать данные активации, такиекак исполняемые, входные или TrustLevel атрибуты.The Application or Extension elements in the package manifest cannot contain activation data such as the Executable, EntryPoint, or TrustLevel attributes. Вместо этого эти элементы могут содержать только атрибут uap10: HostID , который выражает зависимость от узла и атрибута uap10: Parameters .Instead, these elements can only contain a uap10:HostId attribute that expresses the dependency on the host and a uap10:Parameters attribute.
  • Пакет должен быть основным пакетом.The package must be a main package. Это не может быть набор, пакет платформы, ресурс или дополнительный пакет.It cannot be a bundle, framework package, resource, or optional package.

Требования для узла, который устанавливает и регистрирует неподписанный пакет размещенного приложенияRequirements for a host that installs and registers an unsigned hosted app package

ПримерSample

Для полнофункционального примера приложения, которое объявляет себя как узел, а затем динамически регистрирует размещенный пакет приложения во время выполнения, см. Пример размещенного приложения.For a fully functional sample app that declares itself as a host and then dynamically registers a hosted app package at runtime, see the hosted app sample.

Узел.The host

Узел называется пискриптенгине.The host is named PyScriptEngine. Это оболочка, написанная на языке C# и выполняющая скрипты Python.This is a wrapper written in C# that runs python scripts. При запуске с -Register параметром обработчик скриптов устанавливает размещенное приложение, содержащее скрипт Python.When run with the -Register parameter, the script engine installs a hosted app containing a python script. Когда пользователь пытается запустить только что установленное размещенное приложение, узел запускается и выполняет сценарий Python нумбергуессер .When a user tries to launch the newly installed hosted app, the host is launched and executes the NumberGuesser python script.

Манифест пакета для ведущего приложения (файл Package. appxmanifest в папке Пискриптенгинепаккаже) содержит расширение uap10: хострунтиме , которое объявляет приложение в качестве узла с идентификатором писонхост и исполняемым PyScriptEngine.exe.The package manifest for the host app (the Package.appxmanifest file in the PyScriptEnginePackage folder) contains a uap10:HostRuntime extension that declares the app as a host with the ID PythonHost and the executable PyScriptEngine.exe.

Примечание

В этом примере манифест пакета называется Package. appxmanifest и является частью проекта упаковки приложений Windows.In this sample, the package manifest is named Package.appxmanifest and it is part of a Windows Application Packaging Project. При построении этого проекта создается манифест с именем AppxManifest.xml и выполняется сборка пакета MSIX для ведущего приложения.When this project is built, it generates a manifest named AppxManifest.xml and builds the MSIX package for the host app.

Размещенное приложениеThe hosted app

Размещенное приложение состоит из скрипта Python и артефактов пакета, таких как манифест пакета.The hosted app consists of a python script and package artifacts such as the package manifest. Он не содержит PE.It doesn’t contain any PE files.

Манифест пакета для размещенного приложения (файл Нумбергуессер/AppxManifest.xml) содержит следующие элементы:The package manifest for the hosted app (the NumberGuesser/AppxManifest.xml file) contains the following items:

  • Атрибут издателя элемента Identity содержит OID.2.25.311729368913984317654407730594956997722=1 идентификатор, который необходим для неподписанного пакета.The Publisher attribute of the Identity element contains the OID.2.25.311729368913984317654407730594956997722=1 identifer, which is required for an unsigned package.
  • Атрибут uap10: HostID элемента Application определяет писонхост в качестве своего узла.The uap10:HostId attribute of the Application element identifies PythonHost as its host.

Запуск примераRun the sample

Для примера требуется версия 10.0.19041.0 или более поздняя версия Windows 10 и Windows SDK.The sample requires version 10.0.19041.0 or later of Windows 10 and the Windows SDK.

  1. Скачайте Пример в папку на компьютере разработчика.Download the sample to a folder on your development computer.

  2. Откройте решение Пискриптенгине. sln в Visual Studio и установите проект пискриптенгинепаккаже в качестве запускаемого проекта.Open the PyScriptEngine.sln solution in Visual Studio and set the PyScriptEnginePackage project as the startup project.

  3. Создайте проект пискриптенгинепаккаже .Build the PyScriptEnginePackage project.

  4. В обозреватель решений щелкните правой кнопкой мыши проект пискриптенгинепаккаже и выберите пункт развернуть.In Solution Explorer, right-click the PyScriptEnginePackage project and choose Deploy.

  5. Откройте окно командной строки в каталоге, в который были скопированы образцы файлов, и выполните следующую команду, чтобы зарегистрировать пример приложения нумбергуессер (размещенное приложение).Open a Command Prompt window to the directory where you copied the sample files and run the following command to register the sample NumberGuesser app (the hosted app). Перейдите в путь, по D:\repos\HostedApps которому скопированы образцы файлов.Change D:\repos\HostedApps to the path where you copied the sample files.

    D:\repos\HostedApps>pyscriptengine -Register D:\repos\HostedApps\NumberGuesser\AppxManifest.xml
    

    Примечание

    Можно выполнить pyscriptengine в командной строке, так как узел в примере объявляет аппексекутионалиас.You can run pyscriptengine on the command line because the host in the sample declares an AppExecutionAlias.

  6. Откройте меню " Пуск " и выберите нумбергуессер , чтобы запустить размещенное приложение.Open the Start menu and click NumberGuesser to run the hosted app.