Créer des applications hébergéesCreate hosted apps

À compter de Windows 10, version 2004, vous pouvez créer des applications hébergées.Starting in Windows 10, version 2004, you can create hosted apps. Une application hébergée partage le même exécutable et la même définition qu’une application hôte parent, mais elle se présente comme une application distincte sur le système.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.

Les applications hébergées sont utiles dans les scénarios où vous souhaitez qu’un composant (tel qu’un fichier exécutable ou un fichier de script) se comporte comme une application Windows 10 autonome, alors que ce composant nécessite un processus hôte pour pouvoir s’exécuter.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. Par exemple, un script PowerShell ou python peut être fourni sous la forme d’une application hébergée nécessitant l’installation d’un hôte pour pouvoir s’exécuter.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. Une application hébergée peut avoir une vignette de démarrage et une identité qui lui sont propres, tout en intégrant étroitement des fonctionnalités Windows 10, telles que les tâches en arrière-plan, les notifications, les vignettes et les cibles de partage.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.

La fonctionnalité applications hébergées est prise en charge par plusieurs éléments et attributs du manifeste de package qui permettent à une application hébergée d’utiliser un exécutable et une définition dans un package d’application hôte.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. Quand un utilisateur exécute l’application hébergée, le système d’exploitation lance automatiquement l’exécutable hôte sous l’identité de l’application hébergée.When a user runs the hosted app, the OS automatically launches the host executable under the identity of the hosted app. L’hôte peut ensuite charger les ressources visuelles, le contenu ou les API d’appel comme application hébergée.The host can then load visual assets, content, or call APIs as the hosted app. L’application hébergée obtient l’intersection des fonctionnalités déclarées entre l’hôte et l’application hébergée.The hosted app gets the intersection of capabilities declared between the host and hosted app. Cela signifie qu’une application hébergée ne peut pas demander plus de fonctionnalités que celles fournies par l’hôte.This means that a hosted app cannot ask for more capabilities than what the host provides.

Définir un hôteDefine a host

L' hôte est le principal processus exécutable ou d’exécution pour l’application hébergée.The host is the main executable or runtime process for the hosted app. Actuellement, les seuls hôtes pris en charge sont les applications de bureau (.NET ou C++/Win32) qui ont une identité de package.Currently, the only supported hosts are desktop apps (.NET or C++/Win32) that have package identity. Pour le moment, les applications UWP ne sont pas prises en charge en tant qu’hôtes.UWP apps are not supported as hosts at this time. Il existe plusieurs façons pour une application de bureau d’avoir une identité de package :There are several ways for a desktop app to have package identity:

  • La méthode la plus courante pour accorder l’identité d’un package à une application de bureau consiste à l' empaqueter dans un package MSIX.The most common way to grant package identity to a desktop app is by packaging it in an MSIX package.
  • Dans certains cas, vous pouvez également choisir d’accorder l’identité du package en créant un package fragmenté.In some cases, you may alternatively choose to grant package identity by creating a sparse package. Cette option est utile si vous ne pouvez pas adopter l’empaquetage MSIX pour le déploiement de votre application de bureau.This option is useful if you are unable to adopt MSIX packaging for deploying your desktop app.

L’hôte est déclaré dans son manifeste de package par l’extension uap10 : HostRuntime .The host is declared in its package manifest by the uap10:HostRuntime extension. Cette extension a un attribut d' ID auquel une valeur qui est également référencée par le manifeste de package pour l’application hébergée doit être affectée.This extension has an Id attribute that must be assigned a value that is also referenced by the package manifest for the hosted app. Lorsque l’application hébergée est activée, l’ordinateur hôte est lancé sous l’identité de l’application hébergée et peut charger du contenu ou des fichiers binaires à partir du package d’application hébergé.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.

L’exemple suivant montre comment définir un hôte dans un manifeste de package.The following example demonstrates how to define a host in a package manifest. L’extension uap10 : HostRuntime est à l’ensemble du package et est donc déclarée en tant qu’enfant de l’élément de package .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>

Prenez note de ces informations importantes sur les éléments suivants.Make note of these important details about the following elements.

ÉlémentElement DétailsDetails
uap10:Extensionuap10:Extension La windows.hostRuntime catégorie déclare une extension au niveau du package qui définit les informations d’exécution à utiliser lors de l’activation d’une application hébergée.The windows.hostRuntime category declares a package-wide extension that defines the runtime information to be used when activating a hosted app. Une application hébergée s’exécute avec les définitions déclarées dans l’extension.A hosted app will run with the definitions declared in the extension. Quand vous utilisez l’application hôte déclarée dans l’exemple précédent, une application hébergée s’exécute en tant que PyScriptEngine.exe exécutable au niveau de confiance mediumIL .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.

Les attributs executable, uap10 : RuntimeBehavioret uap10 : TrustLevel spécifient le nom du fichier binaire du processus hôte dans le package et comment les applications hébergées s’exécutent.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. Par exemple, une application hébergée utilisant les attributs dans l’exemple précédent s’exécutera en tant que PyScriptEngine.exe exécutable au niveau de confiance mediumIL.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 L’attribut ID déclare l’identificateur unique de cette application hôte spécifique dans le package.The Id attribute declares the unique identifier of this specific host app in the package. Un package peut avoir plusieurs applications hôtes, et chacune doit avoir un élément uap10 : HostRuntime avec un IDunique.A package can have multiple host apps, and each must have a uap10:HostRuntime element with a unique Id.

Déclarer une application hébergéeDeclare a hosted app

Une application hébergée déclare une dépendance de package sur un hôte.A hosted app declares a package dependency on a host. L’application hébergée utilise l’ID de l’hôte (autrement dit, l’attribut ID de l’extension uap10 : HostRuntime dans le package hôte) pour l’activation au lieu de spécifier un exécutable de point d’entrée dans son propre package.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. L’application hébergée contient généralement du contenu, des ressources visuelles, des scripts ou des fichiers binaires qui sont accessibles par l’hôte.The hosted app typically contains content, visual assets, scripts, or binaries that may be accessed by the host. La valeur TargetDeviceFamily dans le package d’application hébergé doit cibler la même valeur que l’hôte.The TargetDeviceFamily value in the hosted app package should target the same value as the host.

Les packages d’application hébergée peuvent être signés ou non signés :Hosted app packages can be signed or unsigned:

  • Les packages signés peuvent contenir des fichiers exécutables.Signed packages may contain executable files. Cela est utile dans les scénarios qui ont un mécanisme d’extension binaire, qui permet à l’hôte de charger une DLL ou un composant inscrit dans le package d’application hébergé.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.
  • Les packages non signés ne peuvent contenir que des fichiers non exécutables.Unsigned packages can only contain non-executable files. Cela est utile dans les scénarios où l’hôte a uniquement besoin de charger des images, des ressources et des fichiers de contenu ou de script.This is useful in scenarios where the host only needs to load images, assets and content or script files. Les packages non signés doivent inclure une OID valeur spéciale dans leur élément Identity ou ils ne sont pas autorisés à s’inscrire.Unsigned packages must include a special OID value in their Identity element or they won’t be allowed to register. Cela empêche les packages non signés d’entrer en conflit ou d’usurper l’identité d’un package signé.This prevents unsigned packages from conflicting with or spoofing the identity of a signed package.

Pour définir une application hébergée, déclarez les éléments suivants dans le manifeste du package :To define a hosted app, declare the following items in the package manifest:

L’exemple suivant illustre les sections correspondantes d’un manifeste de package pour une application hébergée non signée.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>

Prenez note de ces informations importantes sur les éléments suivants.Make note of these important details about the following elements.

ÉlémentElement DétailsDetails
IdentitéIdentity Étant donné que le package d’application hébergé dans cet exemple n’est pas signé, l’attribut Publisher doit inclure la OID.2.25.311729368913984317654407730594956997722=1 chaîne.Because the hosted app package in this example is unsigned, the Publisher attribute must include the OID.2.25.311729368913984317654407730594956997722=1 string. Cela permet de s’assurer que le package non signé ne peut pas usurper l’identité d’un package signé.This ensures that the unsigned package cannot spoof the identity of a signed package.
TargetDeviceFamilyTargetDeviceFamily L’attribut MinVersion doit spécifier 10.0.19041.0 ou une version ultérieure du système d’exploitation.The MinVersion attribute must specify 10.0.19041.0 or a later OS version.
uap10:HostRuntimeDependencyuap10:HostRuntimeDependency Cet élément d’élément déclare une dépendance sur le package d’application hôte.This element element declares a dependency on the host app package. Cela se compose du nom et de l' éditeur du package hôte, ainsi que de la MinVersion dont il dépend.This consists of the Name and Publisher of the host package, and the MinVersion it depends on. Ces valeurs se trouvent sous l’élément Identity dans le package hôte.These values can be found under the Identity element in the host package.
ApplicationApplication L’attribut uap10 : HostID exprime la dépendance sur l’hôte.The uap10:HostId attribute expresses the dependency on the host. Le package d’application hébergé doit déclarer cet attribut à la place des attributs d' exécutable et de point d’entrée habituels pour une application ou un élément d' extension .The hosted app package must declare this attribute instead of the usual Executable and EntryPoint attributes for an Application or Extension element. Par conséquent, l’application hébergée hérite des attributs executable, entryPoint et Runtime de l’hôte avec la valeur HostID correspondante.As a result, the hosted app inherits the Executable, EntryPoint and runtime attributes from the host with the corresponding HostId value.

L’attribut uap10 : Parameters spécifie les paramètres qui sont passés à la fonction de point d’entrée de l’exécutable hôte.The uap10:Parameters attribute specifies parameters that are passed to the entry point function of the host executable. Étant donné que l’hôte doit savoir quoi faire avec ces paramètres, il existe un contrat implicite entre l’hôte et l’application hébergée.Because the host needs to know what to do with these parameters, there is an implied contract between the host and hosted app.

Inscrire un package d’application hébergé non signé au moment de l’exécutionRegister an unsigned hosted app package at run time

L’un des avantages de l’extension uap10 : HostRuntime est qu’elle permet à un hôte de générer de façon dynamique un package d’application hébergé au moment de l’exécution et de l’inscrire à l’aide de l’API packagemanager , sans avoir à le signer.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. Cela permet à un hôte de générer de façon dynamique le contenu et le manifeste du package d’application hébergé, puis de l’inscrire.This enables a host to dynamically generate the content and manifest for the hosted app package and then register it.

Utilisez les méthodes suivantes de la classe packagemanager pour inscrire un package d’application hébergé non signé.Use the following methods of the PackageManager class to register an unsigned hosted app package. Ces méthodes sont disponibles à partir de Windows 10, version 2004.These methods are available starting in Windows 10, version 2004.

  • AddPackageByUriAsync: enregistre un package MSIX non signé à l’aide de la propriété AllowUnsigned du paramètre options .AddPackageByUriAsync: Registers an unsigned MSIX package by using the AllowUnsigned property of the options parameter.
  • RegisterPackageByUriAsync: effectue une inscription de fichier manifeste de package libre.RegisterPackageByUriAsync: Performs a loose package manifest file registration. Si le package est signé, le dossier contenant le manifeste doit inclure un fichier. p7x et un catalogue.If the package is signed, the folder containing the manifest must include a .p7x file and catalog. Si la valeur n’est pas signée, la propriété AllowUnsigned du paramètre options doit être définie.If unsigned, the AllowUnsigned property of the options parameter must be set.

Configuration requise pour les applications hébergées non signéesRequirements for unsigned hosted apps

  • Les éléments d' application ou d' extension du manifeste du package ne peuvent pas contenir de données d’activation telles que les attributs executable, entryPointou trustLevel .The Application or Extension elements in the package manifest cannot contain activation data such as the Executable, EntryPoint, or TrustLevel attributes. Au lieu de cela, ces éléments peuvent uniquement contenir un attribut uap10 : HostID qui exprime la dépendance sur l’hôte et un attribut Uap10 : Parameters .Instead, these elements can only contain a uap10:HostId attribute that expresses the dependency on the host and a uap10:Parameters attribute.
  • Le package doit être un package principal.The package must be a main package. Il ne peut pas s’agir d’un bundle, d’un package d’infrastructure, d’une ressource ou d’un package facultatif.It cannot be a bundle, framework package, resource, or optional package.

Configuration requise pour un ordinateur hôte qui installe et inscrit un package d’application hébergé non signéRequirements for a host that installs and registers an unsigned hosted app package

ExempleSample

Pour obtenir un exemple d’application entièrement fonctionnel qui déclare lui-même en tant qu’hôte, puis inscrit dynamiquement un package d’application hébergé au moment de l’exécution, consultez l' exemple d’application hébergée.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.

HôteThe host

L’hôte est nommé PyScriptEngine.The host is named PyScriptEngine. Il s’agit d’un wrapper écrit en C# qui exécute des scripts Python.This is a wrapper written in C# that runs python scripts. Lorsqu’il est exécuté avec le -Register paramètre, le moteur de script installe une application hébergée contenant un script Python.When run with the -Register parameter, the script engine installs a hosted app containing a python script. Lorsqu’un utilisateur tente de lancer l’application hébergée récemment installée, l’ordinateur hôte est lancé et exécute le script Python NumberGuesser .When a user tries to launch the newly installed hosted app, the host is launched and executes the NumberGuesser python script.

Le manifeste du package pour l’application hôte (le fichier Package. appxmanifest dans le dossier PyScriptEnginePackage) contient une extension uap10 : HostRuntime qui déclare l’application en tant qu’hôte avec l’ID PythonHost et le PyScriptEngine.exeexécutable.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.

Notes

Dans cet exemple, le manifeste du package est nommé Package. appxmanifest et il fait partie d’un projet de packaging des applications Windows.In this sample, the package manifest is named Package.appxmanifest and it is part of a Windows Application Packaging Project. Lorsque ce projet est généré, il génère un manifeste nommé AppxManifest.xml et génère le package MSIX pour l’application hôte.When this project is built, it generates a manifest named AppxManifest.xml and builds the MSIX package for the host app.

L’application hébergéeThe hosted app

L’application hébergée se compose d’un script Python et d’artefacts de package tels que le manifeste du package.The hosted app consists of a python script and package artifacts such as the package manifest. Il ne contient aucun fichier PE.It doesn’t contain any PE files.

Le manifeste du package pour l’application hébergée (le fichier NumberGuesser/AppxManifest.xml) contient les éléments suivants :The package manifest for the hosted app (the NumberGuesser/AppxManifest.xml file) contains the following items:

  • L’attribut Publisher de l’élément Identity contient l' OID.2.25.311729368913984317654407730594956997722=1 identificateur requis pour un package non signé.The Publisher attribute of the Identity element contains the OID.2.25.311729368913984317654407730594956997722=1 identifer, which is required for an unsigned package.
  • L’attribut uap10 : HostID de l’élément application identifie PythonHost en tant qu’hôte.The uap10:HostId attribute of the Application element identifies PythonHost as its host.

Exécution de l'exempleRun the sample

L’exemple requiert la version 10.0.19041.0 ou ultérieure de Windows 10 et le SDK Windows.The sample requires version 10.0.19041.0 or later of Windows 10 and the Windows SDK.

  1. Téléchargez l' exemple dans un dossier sur votre ordinateur de développement.Download the sample to a folder on your development computer.

  2. Ouvrez la solution PyScriptEngine. sln dans Visual Studio et définissez le projet PyScriptEnginePackage comme projet de démarrage.Open the PyScriptEngine.sln solution in Visual Studio and set the PyScriptEnginePackage project as the startup project.

  3. Générez le projet PyScriptEnginePackage .Build the PyScriptEnginePackage project.

  4. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet PyScriptEnginePackage et choisissez déployer.In Solution Explorer, right-click the PyScriptEnginePackage project and choose Deploy.

  5. Ouvrez une fenêtre d’invite de commandes dans le répertoire où vous avez copié les exemples de fichiers et exécutez la commande suivante pour inscrire l’exemple d’application NumberGuesser (l’application hébergée).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). Remplacez D:\repos\HostedApps par le chemin d’accès où vous avez copié les exemples de fichiers.Change D:\repos\HostedApps to the path where you copied the sample files.

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

    Notes

    Vous pouvez exécuter pyscriptengine sur la ligne de commande, car l’hôte de l’exemple déclare un AppExecutionAlias.You can run pyscriptengine on the command line because the host in the sample declares an AppExecutionAlias.

  6. Ouvrez le menu Démarrer et cliquez sur NumberGuesser pour exécuter l’application hébergée.Open the Start menu and click NumberGuesser to run the hosted app.