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 , sieht aber wie eine separate App auf dem System aus und verhält sich wie eine separate App.

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 für die Ausführung ein Host installiert werden muss. 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 gehostete Apps wird von mehreren Elementen und Attributen im Paketmanifest unterstützt, die es einer gehosteten App ermöglichen, eine ausführbare Datei und Definition in einem Host-App-Paket zu verwenden. 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 und Inhalte laden oder APIs als gehostete App aufrufen. Die gehostete App ruft die Schnittmenge von Funktionen ab, die zwischen dem Host und der gehosteten App deklariert wurden. Dies bedeutet, dass eine gehostete App nicht mehr Funktionen anfordern kann, als der Host bereitstellt.

Definieren eines Hosts

Der Host ist der Standard ausführbaren Oder Laufzeitprozess für die gehostete App. Derzeit werden nur Desktop-Apps (.NET oder C++-Desktop) mit Paketidentität unterstützt. Für eine Desktop-App gibt es mehrere Möglichkeiten, eine Paketidentität zu erhalten:

Der Host wird in seinem 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 uap10:HostRuntime-Erweiterung ist paketweit und 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. Bei Verwendung der im vorherigen Beispiel deklarierten Host-App wird eine gehostete App als ausführbare PyScriptEngine.exe auf der Vertrauensebene mediumIL 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 der Vertrauensebene mediumIL ausgeführt.
uap10:HostRuntime Das Id-Attribut deklariert den eindeutigen Bezeichner dieser spezifischen Host-App im Paket. Ein Paket kann mehrere Host-Apps enthalten, und jede 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 ID des Hosts (d. h. das Id-Attribut der uap10:HostRuntime-Erweiterung im Hostpaket) für die Aktivierung, anstatt einen ausführbaren Einstiegspunkt im eigenen Paket anzugeben. Die gehostete App enthält in der Regel Inhalte, visuelle Ressourcen, Skripts oder Binärdateien, auf die der Host möglicherweise zugreift. Der Wert TargetDeviceFamily im gehosteten App-Paket sollte auf denselben Wert wie der Host abzielen.

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

  • Signierte Pakete können ausführbare Dateien enthalten. Dies ist in Szenarien nützlich, die über einen binären Erweiterungsmechanismus verfügen, der es dem Host ermöglicht, eine DLL oder registrierte Komponente in das gehostete 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 nützlich, in denen der Host nur Bilder, Ressourcen und Inhalts- oder Skriptdateien laden muss. Nicht signierte Pakete müssen einen besonderen OID Wert in ihrem Identity-Element enthalten, andernfalls dürfen sie sich nicht registrieren. Dadurch wird verhindert, dass nicht signierte Pakete mit der Identität eines signierten Pakets in Konflikt geraten oder die Identität eines signierten Pakets vortäuschen.

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

Das folgende Beispiel veranschaulicht die relevanten Abschnitte eines Paketmanifests für eine nicht signierte gehostete 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>

Notieren Sie sich diese wichtigen Details zu den folgenden Elementen.

Element Details
Identity 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 vortäuschen 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 Herausgeber des Hostpakets und der MinVersion , von der es abhängt. Diese Werte finden Sie unter dem Identity-Element im Hostpaket.
Anwendung Das uap10:HostId-Attribut drückt die Abhängigkeit vom Host aus. Das gehostete App-Paket muss dieses Attribut anstelle der üblichen ausführbaren Attribute und EntryPoint-Attribute für ein Application- oder Extension-Element deklarieren. Daher erbt die gehostete App die Attribute Executable, EntryPoint und Runtime vom Host mit dem entsprechenden HostId-Wert .

Das uap10:Parameters-Attribut gibt Parameter an, die an die Einstiegspunktfunktion der ausführbaren Host-Datei übergeben werden. Da der Host wissen muss, was mit diesen Parametern zu tun ist, besteht ein impliziter Vertrag zwischen dem Host und der gehosteten App.

Registrieren eines nicht signierten gehosteten App-Pakets zur Laufzeit

Ein Vorteil der uap10:HostRuntime-Erweiterung ist, dass sie es einem Host ermöglicht, ein gehostetes App-Paket zur Laufzeit dynamisch zu generieren und es mithilfe der PackageManager-API zu registrieren, ohne es signieren zu müssen. Dadurch 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 sind ab Windows 10 Version 2004 verfügbar.

  • AddPackageByUriAsync: Registriert ein nicht signiertes MSIX-Paket mithilfe der AllowUnsigned-Eigenschaft des Optionsparameters .
  • RegisterPackageByUriAsync: Führt eine lose Paketmanifestdateiregistrierung aus. 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 dürfen keine Aktivierungsdaten wie das Executable-, EntryPoint- oder TrustLevel-Attribut 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 Standard Paket sein. Es kann sich nicht um ein Bundle, ein Frameworkpaket, eine Ressource oder ein optionales Paket handelt.

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

Beispiel

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

Host

Der Host heißt PyScriptEngine. Dies ist ein in C# geschriebener Wrapper, der Python-Skripts ausführt. Wenn sie mit dem -Register Parameter ausgeführt wird, installiert die Skript-Engine eine gehostete App, die ein Python-Skript enthält. 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.exedeklariert.

Hinweis

In diesem Beispiel hat das Paketmanifest den Namen Package.appxmanifest und ist Teil eines Windows-Anwendungsverpackungsprojekts. Wenn dieses Projekt erstellt wird, generiert es ein Manifest namens 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. Es enthält keine PE-Dateien.

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

  • Das Publisher-Attribut des Identity-Elements enthält den OID.2.25.311729368913984317654407730594956997722=1 identifer, der für ein paket ohne Vorzeichen erforderlich ist.
  • Das uap10:HostId-Attribut des Application-Elements identifiziert PythonHost als seinen 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 Projektmappe PyScriptEngine.sln in Visual Studio, und legen Sie das Projekt PyScriptEnginePackage als Startprojekt fest.

  3. Erstellen Sie das PyScriptEnginePackage-Projekt .

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

  5. Öffnen Sie ein Eingabeaufforderungsfenster in dem 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. Wechseln Sie D:\repos\HostedApps zu dem Pfad, in den Sie die Beispieldateien kopiert haben.

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

    Hinweis

    Sie können über die Befehlszeile ausführen pyscriptengine , da der Host im Beispiel einen AppExecutionAlias deklariert.

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