Créer des applications hébergées

À partir de Windows 10, version 2004, vous pouvez créer des applications hébergées. Une application hébergée partage le même exécutable et la même définition qu’une application hôte parente, mais elle se présente et se comporte comme une application distincte sur le système.

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. Par exemple, un script PowerShell ou Python peut être remis en tant qu’application hébergée qui nécessite l’installation d’un hôte pour s’exécuter. 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.

La fonctionnalité d’applications hébergées est prise en charge par plusieurs éléments et attributs dans le manifeste du package qui permettent à une application hébergée d’utiliser un exécutable et une définition dans un package d’application hôte. Lorsqu’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. L’hôte peut ensuite charger des ressources visuelles, du contenu ou appeler des API en tant qu’application hébergée. L’application hébergée obtient l’intersection des fonctionnalités déclarées entre l’hôte et l’application hébergée. Cela signifie qu’une application hébergée ne peut pas demander plus de fonctionnalités que celles fournies par l’hôte.

Définir un hôte

L’hôte est le main exécutable ou le processus d’exécution pour l’application hébergée. Actuellement, les seuls hôtes pris en charge sont les applications de bureau (bureau.NET ou C++) qui ont une identité de package. Il existe plusieurs façons pour une application de bureau d’avoir une identité de package :

L’hôte est déclaré dans son manifeste de package par l’extension uap10:HostRuntime . Cette extension a un attribut Id qui doit recevoir une valeur qui est également référencée par le manifeste du package pour l’application hébergée. Lorsque l’application hébergée est activée, l’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ée.

L’exemple suivant montre comment définir un hôte dans un manifeste de package. L’extension uap10:HostRuntime est à l’échelle du package et est donc déclarée comme enfant de l’élément Package.

<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>

Notez ces détails importants sur les éléments suivants.

Élément Détails
uap10:Extension La windows.hostRuntime catégorie déclare une extension à l’échelle du package qui définit les informations d’exécution à utiliser lors de l’activation d’une application hébergée. Une application hébergée s’exécute avec les définitions déclarées dans l’extension. Lors de l’utilisation de l’application hôte déclarée dans l’exemple précédent, une application hébergée s’exécute en tant qu’exécutable PyScriptEngine.exe au niveau de confiance mediumIL .

Les attributs Executable, uap10:RuntimeBehavior et uap10:TrustLevel spécifient le nom du binaire du processus hôte dans le package et la façon dont les applications hébergées s’exécuteront. Par exemple, une application hébergée utilisant les attributs de l’exemple précédent s’exécute en tant que PyScriptEngine.exe exécutable au niveau de confiance mediumIL.
uap10:HostRuntime L’attribut Id déclare l’identificateur unique de cette application hôte spécifique dans le package. Un package peut avoir plusieurs applications hôtes, et chacune doit avoir un élément uap10:HostRuntime avec un ID unique.

Déclarer une application hébergée

Une application hébergée déclare une dépendance de package sur un hôte. L’application hébergée utilise l’ID de l’hôte (c’est-à-dire 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. L’application hébergée contient généralement du contenu, des ressources visuelles, des scripts ou des fichiers binaires accessibles par l’hôte. La valeur TargetDeviceFamily dans le package d’application hébergée doit cibler la même valeur que l’hôte.

Les packages d’applications hébergées peuvent être signés ou non signés :

  • Les packages signés peuvent contenir des fichiers exécutables. 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ée.
  • Dans la plupart des scénarios, le package non signé contient du contenu exécutable. Toutefois, un package non signé qui contient uniquement des fichiers non exécutables est utile dans les scénarios où l’hôte doit charger uniquement des images, des ressources et des fichiers de contenu ou de script. Les packages non signés doivent inclure une valeur spéciale OID dans leur élément Identity , sinon ils ne seront pas autorisés à s’inscrire. Cela empêche les packages non signés d’entrer en conflit ou d’usurper l’identité d’un package signé.

Pour définir une application hébergée, déclarez les éléments suivants dans le manifeste du package :

L’exemple suivant illustre les sections pertinentes d’un manifeste de package pour une application hébergée non signée.

<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>

Notez ces détails importants sur les éléments suivants.

Élément Détails
Identité Étant donné que le package d’application hébergée dans cet exemple n’est pas signé, l’attribut Publisher doit inclure la OID.2.25.311729368913984317654407730594956997722=1 chaîne. Cela garantit que le package non signé ne peut pas usurper l’identité d’un package signé.
TargetDeviceFamily L’attribut MinVersion doit spécifier 10.0.19041.0 ou une version ultérieure du système d’exploitation.
uap10:HostRuntimeDependency Cet élément déclare une dépendance vis-à-vis du package d’application hôte. Il s’agit du nom et du serveur de publication du package hôte, et de la MinVersion dont il dépend. Ces valeurs se trouvent sous l’élément Identity dans le package hôte.
Application L’attribut uap10:HostId exprime la dépendance vis-à-vis de l’hôte. Le package d’application hébergée doit déclarer cet attribut au lieu des attributs Executable et EntryPoint habituels pour un élément Application ou Extension . Par conséquent, l’application hébergée hérite des attributs Exécutable, EntryPoint et runtime de l’hôte avec la valeur HostId correspondante.

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. É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.

Inscrire un package d’application hébergée non signé au moment de l’exécution

L’un des avantages de l’extension uap10:HostRuntime est qu’elle permet à un hôte de générer dynamiquement un package d’application hébergée au moment de l’exécution et de l’inscrire à l’aide de l’API PackageManager , sans avoir à le signer. Cela permet à un hôte de générer dynamiquement le contenu et le manifeste du package d’application hébergée, puis de l’inscrire.

Utilisez les méthodes suivantes de la classe PackageManager pour inscrire un package d’application hébergée non signé. Ces méthodes sont disponibles à partir de Windows 10, version 2004.

  • AddPackageByUriAsync : inscrit un package MSIX non signé à l’aide de la propriété AllowUnsigned du paramètre options .
  • RegisterPackageByUriAsync : effectue une inscription de fichier manifeste de package libre. Si le package est signé, le dossier contenant le manifeste doit inclure un fichier .p7x et un catalogue. Si elle n’est pas signée, la propriété AllowUnsigned du paramètre options doit être définie.

Configuration requise pour les applications hébergées non signées

  • Les éléments Application ou Extension du manifeste du package ne peuvent pas contenir de données d’activation telles que les attributs Executable, EntryPoint ou TrustLevel . Au lieu de cela, ces éléments peuvent uniquement contenir un attribut uap10:HostId qui exprime la dépendance vis-à-vis de l’hôte et un attribut uap10:Parameters .
  • Le package doit être un package main. Il ne peut pas s’agir d’un bundle, d’un package d’infrastructure, d’une ressource ou d’un package facultatif.

Configuration requise pour un hôte qui installe et inscrit un package d’application hébergée non signé

Exemple

Pour un exemple d’application entièrement fonctionnelle qui se déclare en tant qu’hôte, puis inscrit dynamiquement un package d’application hébergée au moment de l’exécution, consultez l’exemple d’application hébergée.

Hôte

L’hôte est nommé PyScriptEngine. Il s’agit d’un wrapper écrit en C# qui exécute des scripts Python. Lorsqu’il est exécuté avec le -Register paramètre , le moteur de script installe une application hébergée contenant un script Python. Lorsqu’un utilisateur tente de lancer l’application hébergée nouvellement installée, l’hôte est lancé et exécute le script Python NumberGuesser .

Le manifeste de package de 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 l’exécutable PyScriptEngine.exe.

Notes

Dans cet exemple, le manifeste de package est nommé Package.appxmanifest et fait partie d’un projet d’empaquetage d’applications Windows. 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.

L’application hébergée

L’application hébergée se compose d’un script Python et d’artefacts de package tels que le manifeste du package. Il ne contient aucun fichier PE.

Le manifeste du package de l’application hébergée (le fichier NumberGuesser/AppxManifest.xml) contient les éléments suivants :

  • L’attribut Publisher de l’élément Identity contient l’identifer OID.2.25.311729368913984317654407730594956997722=1 , qui est requis pour un package non signé.
  • L’attribut uap10:HostId de l’élément Application identifie PythonHost comme hôte.

Exécution de l'exemple

L’exemple nécessite la version 10.0.19041.0 ou ultérieure de Windows 10 et le Kit de développement logiciel (SDK) Windows.

  1. Téléchargez l’exemple dans un dossier sur votre ordinateur de développement.

  2. Ouvrez la solution PyScriptEngine.sln dans Visual Studio et définissez le projet PyScriptEnginePackage comme projet de démarrage.

  3. Générez le projet PyScriptEnginePackage .

  4. Dans Explorateur de solutions, cliquez avec le bouton droit sur le projet PyScriptEnginePackage et choisissez Déployer.

  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). Accédez D:\repos\HostedApps au chemin d’accès où vous avez copié les exemples de fichiers.

    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 dans l’exemple déclare un AppExecutionAlias.

  6. Ouvrez le menu Démarrer , puis cliquez sur NumberGuesser pour exécuter l’application hébergée.