Udostępnij przez


Tworzenie hostowanych aplikacji

Począwszy od systemu Windows 10 w wersji 2004, można utworzyć aplikacje hostowane . Aplikacja hostowana udostępnia ten sam plik wykonywalny i definicję co nadrzędna host aplikacji, ale wygląda i zachowuje się jak oddzielna aplikacja w systemie.

Hostowane aplikacje są przydatne w scenariuszach, w których składnik (taki jak plik wykonywalny lub plik skryptu) zachowuje się jak autonomiczna aplikacja systemu Windows 10, ale składnik wymaga procesu hosta w celu wykonania. Na przykład skrypt programu PowerShell lub języka Python można dostarczyć jako hostowaną aplikację, która wymaga zainstalowania hosta w celu uruchomienia. Aplikacja hostowana może mieć własny kafelek startowy, tożsamość i głęboką integrację z funkcjami systemu Windows 10, takimi jak zadania w tle, powiadomienia, kafelki i obiekty docelowe udostępniania.

Funkcja hostowanych aplikacji jest obsługiwana przez kilka elementów i atrybutów w manifeście pakietu, które umożliwiają hostowanej aplikacji używanie pliku wykonywalnego i definicji w pakiecie aplikacji hosta. Gdy użytkownik uruchamia hostowaną aplikację, system operacyjny automatycznie uruchamia plik wykonywalny hosta pod tożsamością hostowanej aplikacji. Host może następnie załadować zasoby wizualne, zawartość lub wywołać interfejsy API jako hostowaną aplikację. Aplikacja hostowana uzyskuje część wspólną możliwości zadeklarowanych między hostem a aplikacją hostowaną. Oznacza to, że hostowana aplikacja nie może poprosić o więcej możliwości niż zapewnia host.

Definiowanie hosta

host jest głównym procesem wykonywalnym lub uruchomieniowym aplikacji hostowanej. Obecnie jedynymi obsługiwanymi hostami są aplikacje dla komputerów stacjonarnych (.NET lub C++), które mają tożsamość pakietu . Istnieje kilka sposobów, aby aplikacja klasyczna miała tożsamość pakietu:

Host jest zadeklarowany w manifeście pakietu przez rozszerzenie uap10:HostRuntime. To rozszerzenie ma atrybut identyfikatora ,, który musi mieć przypisaną wartość, do której odwołuje się również manifest pakietu hostowanej aplikacji. Po aktywowaniu hostowanej aplikacji host jest uruchamiany w ramach tożsamości hostowanej aplikacji i może załadować zawartość lub pliki binarne z hostowanego pakietu aplikacji.

W poniższym przykładzie pokazano, jak zdefiniować hosta w manifeście pakietu. Rozszerzenie uap10:HostRuntime jest rozszerzeniem pakietu i dlatego jest deklarowane jako podrzędny element pakietu .

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

Zanotuj te ważne szczegóły dotyczące następujących elementów.

Składnik Szczegóły
uap10:Extension Kategoria windows.hostRuntime deklaruje rozszerzenie dla całego pakietu, które definiuje informacje o środowisku uruchomieniowym, które mają być używane podczas aktywowania hostowanej aplikacji. Aplikacja hostowana zostanie uruchomiona z definicjami zadeklarowanymi w rozszerzeniu. W przypadku korzystania z aplikacji hosta zadeklarowanej w poprzednim przykładzie, aplikacja hostowana będzie uruchamiana jako wykonywalna PyScriptEngine.exe na poziomie zaufania mediumIL.

Atrybut Wykonywalny, uap10:RuntimeBehaviororaz uap10:TrustLevel określają nazwę pliku binarnego procesu hosta w pakiecie oraz sposób działania hostowanych aplikacji. Na przykład aplikacja hostowana przy użyciu atrybutów w poprzednim przykładzie będzie działać jako plik wykonywalny PyScriptEngine.exe na poziomie zaufania mediumIL.
uap10:HostRuntime Atrybut Id deklaruje unikatowy identyfikator tej konkretnej aplikacji hosta w pakiecie. Pakiet może mieć wiele aplikacji hostów, a każda z nich musi zawierać element uap10:HostRuntime z unikatowym identyfikatorem .

Deklarowanie hostowanej aplikacji

Aplikacja hostowana deklaruje zależność pakietu od hosta . Aplikacja hostowana korzysta z identyfikatora hosta (czyli atrybutu Id rozszerzenia uap10:HostRuntime w pakiecie hosta) do aktywacji zamiast podawania pliku wykonywalnego jako punktu wejścia we własnym pakiecie. Aplikacja hostowana zazwyczaj zawiera zawartość, zasoby wizualne, skrypty lub pliki binarne, do których może uzyskiwać dostęp host. Wartość TargetDeviceFamily w pakiecie hostowanej aplikacji powinna być docelowa tej samej wartości co host.

Hostowane pakiety aplikacji mogą być podpisane lub niepodpisane:

  • Podpisane pakiety mogą zawierać pliki wykonywalne. Jest to przydatne w scenariuszach z mechanizmem rozszerzenia binarnego, który umożliwia hostowi ładowanie biblioteki DLL lub zarejestrowanego składnika w pakiecie hostowanej aplikacji.
  • W większości scenariuszy niepodpisany pakiet będzie zawierać zawartość wykonywalną. Ale niepodpisany pakiet, który zawiera tylko niewykonywalnych plików, jest przydatny w scenariuszach, w których host musi ładować tylko obrazy, zasoby, treści, takie jak pliki skryptów. Niepodpisane pakiety muszą zawierać specjalną wartość OID w elemecie Identity lub nie będą mogli się zarejestrować. Zapobiega to konfliktom z niepodpisanymi pakietami lub podszywaniu się pod tożsamość podpisanego pakietu.

Aby zdefiniować hostowaną aplikację, zadeklaruj następujące elementy w manifeście pakietu:

W poniższym przykładzie pokazano odpowiednie sekcje manifestu pakietu dla niepodpisanej aplikacji hostowanej.

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

Zanotuj te ważne szczegóły dotyczące następujących elementów.

Składnik Szczegóły
Tożsamość Ponieważ pakiet hostowanej aplikacji w tym przykładzie jest niepodpisany, atrybut Publisher musi zawierać ciąg OID.2.25.311729368913984317654407730594956997722=1. Gwarantuje to, że niepodpisany pakiet nie może sfałszować tożsamości podpisanego pakietu.
TargetDeviceFamily Atrybut MinVersion musi określać 10.0.19041.0 lub nowszą wersję systemu operacyjnego.
uap10:HostRuntimeDependency Ten element deklaruje zależność od pakietu aplikacji hosta. Składa się z nazwy i wydawcy pakietu hosta oraz MinimalnejWersji, od której jest zależny. Te wartości można znaleźć w elemecie Identity w pakiecie hosta.
Aplikacja Atrybut uap10:HostId wyraża zależność od hosta. Pakiet hostowanej aplikacji musi zadeklarować ten atrybut zamiast zwykłych atrybutów wykonywalnych i EntryPoint dla elementu aplikacji lub rozszerzenia. W związku z tym aplikacja hostowana dziedziczy wykonywalny, EntryPoint i atrybuty środowiska uruchomieniowego z hosta z odpowiednią wartością HostId.

Atrybut uap10:Parameters określa parametry przekazywane do funkcji wejściowej pliku wykonywalnego hosta. Ponieważ host musi wiedzieć, co zrobić z tymi parametrami, istnieje dorozumiany kontrakt między hostem a aplikacją hostowaną.

Rejestrowanie niepodpisanego pakietu aplikacji hostowanej w czasie wykonywania

Jedną z zalet rozszerzenia uap10:HostRuntime jest umożliwienie hostowi dynamicznego generowania hostowanego pakietu aplikacji w czasie wykonywania i rejestrowania go przy użyciu interfejsu API PackageManager bez konieczności podpisywania go. Umożliwia to hostowi dynamiczne generowanie zawartości i manifestu dla pakietu hostowanej aplikacji, a następnie zarejestrowanie go.

Użyj następujących metod klasy PackageManager, aby zarejestrować niepodpisany pakiet aplikacji hostowanej. Te metody są dostępne w systemie Windows 10 w wersji 2004.

  • AddPackageByUriAsync: zarejestrowanie niepodpisanego pakietu MSIX za pomocą właściwości AllowUnsigned opcji parametru .
  • RegisterPackageByUriAsync: wykonuje luźną rejestrację pliku manifestu pakietu. Jeśli pakiet jest podpisany, folder zawierający manifest musi zawierać plik .p7x i wykaz. Jeśli niepodpisane, należy ustawić właściwość AllowUnsigned parametru opcji .

Wymagania dotyczące niepodpisanych aplikacji hostowanych

  • Elementy Application lub Extension w manifeście pakietu nie mogą zawierać danych aktywacji, takich jak atrybuty: Plik wykonywalny, EntryPointlub TrustLevel. Zamiast tego te elementy mogą zawierać tylko atrybut uap10:HostId, który wyraża zależność od hosta i atrybut uap10:Parameters.
  • Pakiet musi być głównym pakietem. Nie może to być pakiet zbiorczy, pakiet szkieletowy, zasób lub opcjonalny pakiet.

Wymagania dotyczące hosta, który instaluje i rejestruje niepodpisany pakiet aplikacji hostowanej

Przykład

Aby uzyskać w pełni funkcjonalną przykładową aplikację, która deklaruje się jako host, a następnie dynamicznie rejestruje pakiet hostowanej aplikacji w czasie wykonywania, zobacz przykładową aplikację hostowaną .

Gospodarz

Host ma nazwę PyScriptEngine. Jest to nakładka napisana w C#, która uruchamia skrypty Python. Po uruchomieniu za pomocą parametru -Register aparat skryptu instaluje hostowaną aplikację zawierającą skrypt języka Python. Gdy użytkownik próbuje uruchomić nowo zainstalowaną aplikację hostowaną, zostanie uruchomiony host i wykona skrypt NumberGuesser python.

Manifest pakietu dla aplikacji hosta (plik Package.appxmanifest w folderze PyScriptEnginePackage) zawiera rozszerzenie uap10:HostRuntime, które deklaruje aplikację jako host z identyfikatorem PythonHost i plikiem wykonywalnym PyScriptEngine.exe.

Uwaga / Notatka

W tym przykładzie manifest pakietu nosi nazwę Package.appxmanifest i jest częścią projektu tworzenia pakietów aplikacji systemu Windows. Podczas kompilowania tego projektu generuje manifest o nazwie AppxManifest.xml i kompiluje pakiet MSIX dla aplikacji hosta.

Hostowana aplikacja

Hostowana aplikacja składa się ze skryptu języka Python i artefaktów pakietu, takich jak manifest pakietu. Nie zawiera żadnych plików PE.

Manifest pakietu dla aplikacji hostowanej (plik NumberGuesser/AppxManifest.xml) zawiera następujące elementy:

  • Atrybut Publisher elementu Identity zawiera OID.2.25.311729368913984317654407730594956997722=1 identyfikator, który jest wymagany dla niepodpisanego pakietu.
  • Atrybut uap10:HostId elementu aplikacji identyfikuje PythonHost jako hosta.

Uruchamianie aplikacji przykładowej

Przykład wymaga wersji 10.0.19041.0 lub nowszej systemu Windows 10 i zestawu Windows SDK.

  1. Pobierz przykładową do folderu na komputerze dewelopera.

  2. Otwórz rozwiązanie PyScriptEngine.sln w programie Visual Studio i ustaw projekt PyScriptEnginePackage jako projekt startowy.

  3. Zbuduj projekt PyScriptEnginePackage.

  4. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt PyScriptEnginePackage i wybierz pozycję Wdróż.

  5. Otwórz okno wiersza polecenia w katalogu, w którym skopiowano przykładowe pliki, i uruchom następujące polecenie, aby zarejestrować przykładową aplikację NumberGuesser (hostowaną aplikację). Zmień D:\repos\HostedApps na ścieżkę, w której skopiowano przykładowe pliki.

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

    Uwaga / Notatka

    Możesz uruchomić pyscriptengine w wierszu polecenia, ponieważ host w przykładzie deklaruje AppExecutionAlias.

  6. Otwórz menu Start i kliknij NumberGuesser, aby uruchomić hostowaną aplikację.