Erstellen gehosteter Apps

Ab Windows 10, Version 2004, können Sie gehostete Apps erstellen. Eine gehostete App verwendet dieselbe ausführbare Datei und Definition wie eine übergeordnete Host-App , verhält sich aber wie eine separate App im System.

Gehostete Apps sind nützlich für Szenarios, in denen sich eine Komponente (z. B. eine ausführbare Datei oder eine Skriptdatei) wie eine eigenständige Windows 10-App verhalten soll. Die Komponente erfordert jedoch einen Hostprozess, um ausgeführt werden zu können. Beispielsweise könnte ein PowerShell- oder Python-Skript als gehostete App bereitgestellt werden, für die ein Host installiert werden muss, um ausgeführt werden zu können. Eine gehostete App kann über eine eigene Startkachel, eine eigene Identität und eine umfassende Integration in Windows 10-Features verfügen, z. B. Hintergrundaufgaben, Benachrichtigungen, Kacheln und Freigabeziele.

Das Feature für gehostete Apps wird von mehreren Elementen und Attributen im Paketmanifest unterstützt, mit denen eine gehostete App eine ausführbare Datei und Definition in einem Host-App-Paket verwenden kann. Wenn ein Benutzer die gehostete App ausführt, startet das Betriebssystem automatisch die ausführbare Hostdatei unter der Identität der gehosteten App. Der Host kann dann visuelle Ressourcen, Inhalte oder APIs als gehostete App laden. Die gehostete App ruft die Schnittmenge der Funktionen ab, die zwischen dem Host und der gehosteten App deklariert sind. Dies bedeutet, dass eine gehostete App nicht mehr Funktionen anfordern kann als das, was der Host bereitstellt.

Definieren eines Hosts

Der Host ist der haupt ausführbare Datei- oder Laufzeitprozess für die gehostete App. Derzeit sind die einzigen unterstützten Hosts Desktop-Apps (.NET- oder C++-Desktop), die paketidentitäten aufweisen. Es gibt mehrere Möglichkeiten für eine Desktop-App, paketidentitäten zu haben:

  • Die am häufigsten verwendete Methode zum Gewähren von Paketidentitäten für eine Desktop-App besteht darin , sie in einem MSIX-Paket zu verpacken.
  • In einigen Fällen können Sie alternativ die Paketidentität gewähren, indem Sie ein Paket mit externem Speicherort erstellen (siehe Grant package identity by packaging with external location). Diese Option ist nützlich, wenn Sie MSIX nicht zum Installieren Ihrer Desktop-App übernehmen können.

Der Host wird im Paketmanifest von der Erweiterung "uap10:HostRuntime " deklariert. Diese Erweiterung verfügt über ein ID-Attribut , dem ein Wert zugewiesen werden muss, auf den auch das Paketmanifest für die gehostete App verweist. Wenn die gehostete App aktiviert wird, wird der Host unter der Identität der gehosteten App gestartet und kann Inhalte oder Binärdateien aus dem gehosteten App-Paket laden.

Im folgenden Beispiel wird veranschaulicht, wie ein Host in einem Paketmanifest definiert wird. Die Erweiterung "uap10:HostRuntime " ist paketweit und wird daher als untergeordnetes Element des Package-Elements deklariert.

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

Notieren Sie sich diese wichtigen Details zu den folgenden Elementen.

Element Details
uap10:Extension Die windows.hostRuntime Kategorie deklariert eine paketweite Erweiterung, die die Laufzeitinformationen definiert, die beim Aktivieren einer gehosteten App verwendet werden sollen. Eine gehostete App wird mit den in der Erweiterung deklarierten Definitionen ausgeführt. Wenn Sie die im vorherigen Beispiel deklarierte Host-App verwenden, wird eine gehostete App als ausführbare PyScriptEngine.exe auf mittlereR Vertrauensebene ausgeführt.

Die Attribute "Executable", "uap10:RuntimeBehavior" und "uap10:TrustLevel " geben den Namen der Hostprozess-Binärdatei im Paket und die Ausführung der gehosteten Apps an. Beispielsweise wird eine gehostete App, die die Attribute im vorherigen Beispiel verwendet, als ausführbare PyScriptEngine.exe auf mediumIL-Vertrauensebene ausgeführt.
uap10:HostRuntime Das Id-Attribut deklariert den eindeutigen Bezeichner dieser spezifischen Host-App im Paket. Ein Paket kann über mehrere Host-Apps verfügen, und jedes muss über ein uap10:HostRuntime-Element mit einer eindeutigen ID verfügen.

Deklarieren einer gehosteten App

Eine gehostete App deklariert eine Paketabhängigkeit von einem Host. Die gehostete App nutzt die HOST-ID (d. h. das ID-Attribut der Erweiterung uap10:HostRuntime im Hostpaket) für die Aktivierung, anstatt eine ausführbare Einstiegspunktdatei in ihrem eigenen Paket anzugeben. Die gehostete App enthält in der Regel Inhalte, visuelle Ressourcen, Skripts oder Binärdateien, auf die vom Host zugegriffen werden kann. Der TargetDeviceFamily-Wert im gehosteten App-Paket sollte auf denselben Wert wie der Host abzielen.

Gehostete App-Pakete können signiert oder nicht signiert werden:

  • Signierte Pakete können ausführbare Dateien enthalten. Dies ist in Szenarien hilfreich, die über einen binären Erweiterungsmechanismus verfügen, der es dem Host ermöglicht, eine DLL oder registrierte Komponente im gehosteten App-Paket zu laden.
  • In den meisten Szenarien enthält das nicht signierte Paket ausführbare Inhalte. Ein nicht signiertes Paket, das nur nicht ausführbare Dateien enthält, ist jedoch in Szenarien hilfreich, in denen der Host nur Bilder, Objekte und Inhalte oder Skriptdateien laden muss. Nicht signierte Pakete müssen einen speziellen OID Wert in ihrem Identity-Element enthalten, oder sie dürfen sich nicht registrieren. Dadurch wird verhindert, dass nicht signierte Pakete mit der Identität eines signierten Pakets in Konflikt geraten oder spoofen.

Um eine gehostete App zu definieren, deklarieren Sie die folgenden Elemente im Paketmanifest:

Im folgenden Beispiel werden die relevanten Abschnitte eines Paketmanifests für eine nicht signierte gehostete App veranschaulicht.

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

Notieren Sie sich diese wichtigen Details zu den folgenden Elementen.

Element Details
Identität Da das gehostete App-Paket in diesem Beispiel nicht signiert ist, muss das Publisher-Attribut die OID.2.25.311729368913984317654407730594956997722=1 Zeichenfolge enthalten. Dadurch wird sichergestellt, dass das nicht signierte Paket die Identität eines signierten Pakets nicht spoofen kann.
TargetDeviceFamily Das MinVersion-Attribut muss 10.0.19041.0 oder eine höhere Betriebssystemversion angeben.
uap10:HostRuntimeDependency Dieses Elementelement deklariert eine Abhängigkeit vom Host-App-Paket. Dies besteht aus dem Namen und Publisher des Hostpakets und der MinVersion, von der es abhängt. Diese Werte finden Sie unter dem Identity-Element im Hostpaket.
Anwendung Das Attribut "uap10:HostId " gibt die Abhängigkeit vom Host aus. Das gehostete App-Paket muss dieses Attribut anstelle der üblichen Attribute "Ausführbare Datei" und "EntryPoint" für ein Application- oder Extension-Element deklarieren. Daher erbt die gehostete App die Attribute "Ausführbare Datei", "EntryPoint " und "Runtime" vom Host mit dem entsprechenden HostId-Wert .

Das Attribut "uap10:Parameters " gibt Parameter an, die an die Einstiegspunktfunktion der ausführbaren Hostdatei übergeben werden. Da der Host wissen muss, was mit diesen Parametern zu tun ist, gibt es einen implizierten Vertrag zwischen dem Host und der gehosteten App.

Registrieren eines nicht signierten gehosteten App-Pakets zur Laufzeit

Ein Vorteil der Erweiterung "uap10:HostRuntime " besteht darin, dass ein Host ein gehostetes App-Paket zur Laufzeit dynamisch generieren und mithilfe der PackageManager-API registrieren kann, ohne es signieren zu müssen. Auf diese Weise kann ein Host den Inhalt und das Manifest für das gehostete App-Paket dynamisch generieren und dann registrieren.

Verwenden Sie die folgenden Methoden der PackageManager-Klasse , um ein nicht signiertes gehostetes App-Paket zu registrieren. Diese Methoden stehen ab Windows 10, Version 2004, zur Verfügung.

  • AddPackageByUriAsync: Registriert ein nicht signiertes MSIX-Paket mithilfe der AllowUnsigned-Eigenschaft des Optionsparameters .
  • RegisterPackageByUriAsync: Führt eine Registrierung einer losen Paketmanifestdatei durch. Wenn das Paket signiert ist, muss der Ordner, der das Manifest enthält, eine P7X-Datei und einen Katalog enthalten. Wenn nicht signiert, muss die AllowUnsigned-Eigenschaft des Optionsparameters festgelegt werden.

Anforderungen für nicht signierte gehostete Apps

  • Die Anwendungs- oder Erweiterungselemente im Paketmanifest können keine Aktivierungsdaten wie ausführbare, EntryPoint- oder TrustLevel-Attribute enthalten. Stattdessen können diese Elemente nur ein uap10:HostId-Attribut enthalten, das die Abhängigkeit vom Host und ein uap10:Parameters-Attribut ausdrückt.
  • Das Paket muss ein Hauptpaket sein. Es kann sich nicht um ein Paket, ein Frameworkpaket, eine Ressource oder ein optionales Paket handeln.

Anforderungen für einen Host, der ein nicht signiertes gehostetes App-Paket installiert und registriert

  • Der Host muss über eine Paketidentität verfügen.
  • Der Host muss über die eingeschränkte PackageManagement-Funktion verfügen.
    <rescap:Capability Name="packageManagement" />
    

Beispiel

Eine voll funktionsfähige Beispiel-App, die sich selbst als Host deklariert und dann dynamisch ein gehostetes App-Paket zur Laufzeit registriert, finden Sie im Beispiel für gehostete Apps.

Der Host

Der Host heißt PyScriptEngine. Dies ist ein Wrapper, der in C# geschrieben wurde, der Python-Skripts ausführt. Wenn sie mit dem -Register Parameter ausgeführt wird, installiert das Skriptmodul eine gehostete App mit einem Python-Skript. Wenn ein Benutzer versucht, die neu installierte gehostete App zu starten, wird der Host gestartet und führt das Python-Skript NumberGuesser aus.

Das Paketmanifest für die Host-App (die Datei "Package.appxmanifest" im Ordner "PyScriptEnginePackage") enthält eine uap10:HostRuntime-Erweiterung, die die App als Host mit der ID PythonHost und der ausführbaren PyScriptEngine.exe deklariert.

Hinweis

In diesem Beispiel heißt das Paketmanifest "Package.appxmanifest" und ist Teil eines Windows Application Packaging-Projekts. Wenn dieses Projekt erstellt wird, generiert es ein Manifest mit dem Namen AppxManifest.xml und erstellt das MSIX-Paket für die Host-App.

Die gehostete App

Die gehostete App besteht aus einem Python-Skript und Paketartefakten wie dem Paketmanifest. Sie enthält keine PE-Dateien.

Das Paketmanifest für die gehostete App (die NumberGuesser/AppxManifest.xml-Datei) enthält die folgenden Elemente:

  • Das Publisher-Attribut des Identity-Elements enthält den Bezeichner, der OID.2.25.311729368913984317654407730594956997722=1 für ein nicht signiertes Paket erforderlich ist.
  • Das Attribut "uap10:HostId" des Application-Elements identifiziert PythonHost als Host.

Ausführen des Beispiels

Für das Beispiel ist Version 10.0.19041.0 oder höher von Windows 10 und dem Windows SDK erforderlich.

  1. Laden Sie das Beispiel in einen Ordner auf Ihrem Entwicklungscomputer herunter.

  2. Öffnen Sie die PyScriptEngine.sln Projektmappe in Visual Studio, und legen Sie das PyScriptEnginePackage-Projekt als Startprojekt fest.

  3. Erstellen Sie das PyScriptEnginePackage-Projekt .

  4. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das PyScriptEnginePackage-Projekt, und wählen Sie "Bereitstellen" aus.

  5. Öffnen Sie ein Eingabeaufforderungsfenster in das Verzeichnis, in das Sie die Beispieldateien kopiert haben, und führen Sie den folgenden Befehl aus, um die Beispiel-NumberGuesser-App (die gehostete App) zu registrieren. Ändern Sie D:\repos\HostedApps den Pfad, in den Sie die Beispieldateien kopiert haben.

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

    Hinweis

    Sie können auf der Befehlszeile ausführen pyscriptengine , da der Host im Beispiel eine AppExecutionAlias deklariert.

  6. Öffnen Sie das Startmenü , und klicken Sie auf NumberGuesser , um die gehostete App auszuführen.