Partager via


Créer des applications hébergées

À compter 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 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é des applications hébergées est prise en charge par plusieurs éléments et attributs dans le 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. 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 ce que fournit l’hôte.

Définir un hôte

L’hôte est le principal exécutable ou processus d’exécution de l’application hébergée. Actuellement, les seuls hôtes pris en charge sont des 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 :

  • La façon la plus courante d’accorder une identité de package à une application de bureau consiste à l’empaqueter dans un package MSIX.
  • Dans certains cas, vous pouvez également choisir d’accorder une identité de package en créant un package à l’emplacement externe (voir Grant package identity by packaging with external location). Cette option est utile si vous ne parvenez pas à adopter MSIX pour installer votre application de bureau.

L’hôte est déclaré dans son manifeste de package par l’extension uap10 :HostRuntime . Cette extension a un attribut ID qui doit être affecté à 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é.

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 en tant qu’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. Lorsque 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 qu’exécutable PyScriptEngine.exe au niveau de confiance mediumIL .

Les attributs Exécutable, uap10 :RuntimeBehavior et uap10 :TrustLevel spécifient le nom du fichier binaire du processus hôte dans le package et la façon dont les applications hébergées s’exécutent. Par exemple, une application hébergée utilisant les attributs de l’exemple précédent s’exécute en tant qu’exécutable PyScriptEngine.exe 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 chacun 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 tire parti de 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. 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é doit cibler la même valeur que l’hôte.

Les packages d’application hébergés 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é.
  • 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 du contenu ou des fichiers de script. Les packages non signés doivent inclure une valeur spéciale OID dans leur élément Identity ou ils ne seront pas autorisés à s’inscrire. Cela empêche les packages non signés d’entrer en conflit avec 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é 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 sur le 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 sont disponibles sous l’élément Identity dans le package hôte.
Application L’attribut uap10 :HostId exprime la dépendance sur l’hôte. Le package d’application hébergé doit déclarer cet attribut au lieu des attributs Exécutable 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é non signé au moment de l’exécution

L’un des avantages de l’extension uap10 :HostRuntime est qu’il permet à un hôte de générer dynamiquement 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. 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é 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 d’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 et un catalogue .p7x. Si ce paramètre n’est pas signé, la propriété AllowUnsigned du paramètre d’options doit être définie.

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

  • Les éléments Application ou Extension du manifeste de package ne peuvent pas contenir de données d’activation telles que les attributs Exécutable, EntryPoint ou TrustLevel. Au lieu de cela, ces éléments ne peuvent contenir qu’un attribut uap10 :HostId qui exprime la dépendance sur l’hôte et un attribut uap10 :Parameters .
  • Le package doit être un package principal. 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é non signé

  • L’hôte doit avoir une identité de package.
  • L’hôte doit disposer de la fonctionnalité restreinte packageManagement.
    <rescap:Capability Name="packageManagement" />
    

Exemple

Pour obtenir un exemple d’application entièrement fonctionnel qui se déclare 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.

L’hôte

L’hôte est nommé PyScriptEngine. Il s’agit d’un wrapper écrit en C# qui exécute des scripts Python. Lors de l’exécution avec le paramètre, le moteur de -Register 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.

Remarque

Dans cet exemple, le manifeste du 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 de package de l’application hébergée (fichier NumberGuesser/AppxManifest.xml) contient les éléments suivants :

  • L’attribut Publisher de l’élément Identity contient l’identificateur 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
    

    Remarque

    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.