Creare app ospitateCreate hosted apps

A partire da Windows 10, versione 2004, è possibile creare app ospitate.Starting in Windows 10, version 2004, you can create hosted apps. Un'app ospitata condivide lo stesso eseguibile e la stessa definizione di un'app host padre, ma sembra e si comporta come un'app separata nel sistema.A hosted app shares the same executable and definition as a parent host app, but it looks and behaves like a separate app on the system.

Le app ospitate sono utili per gli scenari in cui si vuole che un componente, ad esempio un file eseguibile o un file di script, si comporti come un'app di Windows 10 autonoma, ma il componente richiede un processo host per poter essere eseguito.Hosted apps are useful for scenarios where you want a component (such as an executable file or a script file) to behave like a standalone Windows 10 app, but the component requires a host process in order to execute. Ad esempio, uno script PowerShell o Python può essere recapitato come un'app ospitata che richiede l'installazione di un host per poter essere eseguito.For example, a PowerShell or Python script could be delivered as a hosted app that requires a host to be installed in order to run. Un'app ospitata può avere un proprio riquadro iniziale, un'identità e un'integrazione completa con le funzionalità di Windows 10, ad esempio le attività in background, le notifiche, i riquadri e le destinazioni di condivisione.A hosted app can have its own start tile, identity, and deep integration with Windows 10 features such as background tasks, notifications, tiles, and share targets.

La funzionalità app ospitate è supportata da diversi elementi e attributi nel manifesto del pacchetto che consentono a un'app ospitata di usare un eseguibile e una definizione in un pacchetto dell'app host.The hosted apps feature is supported by several elements and attributes in the package manifest that enable a hosted app to use an executable and definition in a host app package. Quando un utente esegue l'app ospitata, il sistema operativo avvia automaticamente il file eseguibile dell'host con l'identità dell'app ospitata.When a user runs the hosted app, the OS automatically launches the host executable under the identity of the hosted app. L'host può quindi caricare gli asset visivi, il contenuto o le API di chiamata come app ospitata.The host can then load visual assets, content, or call APIs as the hosted app. L'app ospitata Ottiene l'intersezione delle funzionalità dichiarate tra l'host e l'app ospitata.The hosted app gets the intersection of capabilities declared between the host and hosted app. Ciò significa che un'app ospitata non può richiedere più funzionalità rispetto a quelle fornite dall'host.This means that a hosted app cannot ask for more capabilities than what the host provides.

Definire un hostDefine a host

L' host è il processo di runtime o eseguibile principale per l'app ospitata.The host is the main executable or runtime process for the hosted app. Attualmente, gli unici host supportati sono le applicazioni desktop (.NET o C++/Win32) con identità del pacchetto.Currently, the only supported hosts are desktop apps (.NET or C++/Win32) that have package identity. Al momento le app UWP non sono supportate come host.UWP apps are not supported as hosts at this time. Per un'app desktop è possibile avere un'identità del pacchetto in diversi modi:There are several ways for a desktop app to have package identity:

  • Il modo più comune per concedere l'identità del pacchetto a un'app desktop consiste nel comprimerlo in un pacchetto MSIX.The most common way to grant package identity to a desktop app is by packaging it in an MSIX package.
  • In alcuni casi, è possibile scegliere di concedere l'identità del pacchetto creando un pacchetto sparse.In some cases, you may alternatively choose to grant package identity by creating a sparse package. Questa opzione è utile se non si è in grado di adottare MSIX packaging per la distribuzione dell'app desktop.This option is useful if you are unable to adopt MSIX packaging for deploying your desktop app.

L'host viene dichiarato nel manifesto del pacchetto dall'estensione uap10: HostRuntime .The host is declared in its package manifest by the uap10:HostRuntime extension. Questa estensione dispone di un attributo ID a cui deve essere assegnato un valore a cui fa riferimento anche il manifesto del pacchetto per l'app ospitata.This extension has an Id attribute that must be assigned a value that is also referenced by the package manifest for the hosted app. Quando l'app ospitata è attivata, l'host viene avviato con l'identità dell'app ospitata e può caricare il contenuto o i file binari dal pacchetto dell'app ospitata.When the hosted app is activated, the host is launched under the identity of the hosted app and can load content or binaries from the hosted app package.

Nell'esempio seguente viene illustrato come definire un host in un manifesto del pacchetto.The following example demonstrates how to define a host in a package manifest. L'estensione uap10: HostRuntime è a livello di pacchetto e pertanto viene dichiarata come figlio dell'elemento del pacchetto .The uap10:HostRuntime extension is package-wide and is therefore declared as a child of the Package element.

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

Prendere nota di queste importanti informazioni sui seguenti elementi.Make note of these important details about the following elements.

ElementoElement DettagliDetails
uap10:Extensionuap10:Extension La windows.hostRuntime categoria dichiara un'estensione a livello di pacchetto che definisce le informazioni di runtime da usare quando si attiva un'app ospitata.The windows.hostRuntime category declares a package-wide extension that defines the runtime information to be used when activating a hosted app. Un'app ospitata viene eseguita con le definizioni dichiarate nell'estensione.A hosted app will run with the definitions declared in the extension. Quando si usa l'app host dichiarata nell'esempio precedente, un'app ospitata viene eseguita come eseguibile PyScriptEngine.exe al livello di attendibilità mediumIL .When using the host app declared in the previous example, a hosted app will run as the executable PyScriptEngine.exe at the mediumIL trust level.

Gli attributi Executable, uap10: RuntimeBehaviore uap10: TrustLevel specificano il nome del file binario del processo host nel pacchetto e il modo in cui le app ospitate vengono eseguite.The Executable, uap10:RuntimeBehavior, and uap10:TrustLevel attributes specify the name of the host process binary in the package and how the hosted apps will run. Ad esempio, un'app ospitata che usa gli attributi dell'esempio precedente viene eseguita come eseguibile PyScriptEngine.exe al livello di attendibilità mediumIL.For example, a hosted app using the attributes in the previous example will run as the executable PyScriptEngine.exe at mediumIL trust level.
uap10:HostRuntimeuap10:HostRuntime L'attributo ID dichiara l'identificatore univoco di questa specifica app host nel pacchetto.The Id attribute declares the unique identifier of this specific host app in the package. Un pacchetto può avere più app host e ognuna deve avere un elemento uap10: HostRuntime con un IDunivoco.A package can have multiple host apps, and each must have a uap10:HostRuntime element with a unique Id.

Dichiarare un'app ospitataDeclare a hosted app

Un' app ospitata dichiara una dipendenza del pacchetto in un host.A hosted app declares a package dependency on a host. L'app ospitata usa l'ID dell'host, ovvero l'attributo ID dell'estensione uap10: HostRuntime nel pacchetto host, per l'attivazione invece di specificare un eseguibile del punto di ingresso in un pacchetto specifico.The hosted app leverages the host's ID (that is, the Id attribute of the uap10:HostRuntime extension in the host package) for activation instead of specifying an entry point executable in its own package. L'app ospitata contiene in genere contenuto, asset visivi, script o file binari a cui l'host può accedere.The hosted app typically contains content, visual assets, scripts, or binaries that may be accessed by the host. Il valore TargetDeviceFamily nel pacchetto dell'app ospitata deve avere come destinazione lo stesso valore dell'host.The TargetDeviceFamily value in the hosted app package should target the same value as the host.

I pacchetti dell'app ospitata possono essere firmati o non firmati:Hosted app packages can be signed or unsigned:

  • I pacchetti firmati possono contenere file eseguibili.Signed packages may contain executable files. Questa operazione è utile negli scenari in cui è disponibile un meccanismo di estensione binario che consente all'host di caricare una DLL o un componente registrato nel pacchetto dell'app ospitata.This is useful in scenarios that have a binary extension mechanism, which enables the host to load a DLL or registered component in the hosted app package.
  • I pacchetti non firmati possono contenere solo file non eseguibili.Unsigned packages can only contain non-executable files. Questa operazione è utile negli scenari in cui l'host deve solo caricare immagini, asset, contenuto o file di script.This is useful in scenarios where the host only needs to load images, assets and content or script files. I pacchetti non firmati devono includere un OID valore speciale nell'elemento Identity oppure non possono essere registrati.Unsigned packages must include a special OID value in their Identity element or they won’t be allowed to register. In questo modo si impedisce che i pacchetti non firmati riscontrino o spoofingno l'identità di un pacchetto firmato.This prevents unsigned packages from conflicting with or spoofing the identity of a signed package.

Per definire un'app ospitata, dichiarare gli elementi seguenti nel manifesto del pacchetto:To define a hosted app, declare the following items in the package manifest:

Nell'esempio seguente vengono illustrate le sezioni pertinenti di un manifesto del pacchetto per un'app ospitata senza segno.The following example demonstrates the relevant sections of a package manifest for an unsigned hosted 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>

Prendere nota di queste importanti informazioni sui seguenti elementi.Make note of these important details about the following elements.

ElementoElement DettagliDetails
IdentitàIdentity Poiché il pacchetto dell'app ospitata in questo esempio è senza segno, l'attributo Publisher deve includere la OID.2.25.311729368913984317654407730594956997722=1 stringa.Because the hosted app package in this example is unsigned, the Publisher attribute must include the OID.2.25.311729368913984317654407730594956997722=1 string. In questo modo si garantisce che il pacchetto non firmato non possa eseguire lo spoofing dell'identità di un pacchetto firmato.This ensures that the unsigned package cannot spoof the identity of a signed package.
TargetDeviceFamilyTargetDeviceFamily L'attributo MinVersion deve specificare 10.0.19041.0 o una versione successiva del sistema operativo.The MinVersion attribute must specify 10.0.19041.0 or a later OS version.
uap10:HostRuntimeDependencyuap10:HostRuntimeDependency Questo elemento dell'elemento dichiara una dipendenza dal pacchetto dell'applicazione host.This element element declares a dependency on the host app package. È costituito dal nome e dall' editore del pacchetto host e dal MinVersion da cui dipende.This consists of the Name and Publisher of the host package, and the MinVersion it depends on. Questi valori sono disponibili nell'elemento Identity nel pacchetto host.These values can be found under the Identity element in the host package.
ApplicazioneApplication L'attributo uap10: hostid esprime la dipendenza dall'host.The uap10:HostId attribute expresses the dependency on the host. Il pacchetto dell'app ospitata deve dichiarare questo attributo anziché i normali attributi eseguibili e EntryPoint per un' applicazione o un elemento di estensione .The hosted app package must declare this attribute instead of the usual Executable and EntryPoint attributes for an Application or Extension element. Di conseguenza, l'app ospitata eredita gli attributi eseguibile, EntryPoint e runtime dall'host con il valore HostID corrispondente.As a result, the hosted app inherits the Executable, EntryPoint and runtime attributes from the host with the corresponding HostId value.

L'attributo uap10: Parameters specifica i parametri passati alla funzione del punto di ingresso del file eseguibile dell'host.The uap10:Parameters attribute specifies parameters that are passed to the entry point function of the host executable. Poiché l'host deve sapere cosa fare con questi parametri, esiste un contratto implicito tra l'host e l'app ospitata.Because the host needs to know what to do with these parameters, there is an implied contract between the host and hosted app.

Registrare un pacchetto dell'app ospitata senza segno in fase di esecuzioneRegister an unsigned hosted app package at run time

Uno dei vantaggi dell'estensione uap10: HostRuntime è che consente a un host di generare dinamicamente un pacchetto dell'app ospitata in fase di esecuzione e di registrarlo usando l'API PackageManager , senza che sia necessario firmarlo.One benefit of the uap10:HostRuntime extension is that it enables a host to dynamically generate a hosted app package at runtime and register it by using the PackageManager API, without needing to sign it. Ciò consente a un host di generare dinamicamente il contenuto e il manifesto per il pacchetto dell'app ospitata e di registrarlo.This enables a host to dynamically generate the content and manifest for the hosted app package and then register it.

Usare i metodi seguenti della classe PackageManager per registrare un pacchetto dell'app ospitata senza segno.Use the following methods of the PackageManager class to register an unsigned hosted app package. Questi metodi sono disponibili a partire da Windows 10, versione 2004.These methods are available starting in Windows 10, version 2004.

  • AddPackageByUriAsync: registra un pacchetto MSIX senza segno usando la proprietà AllowUnsigned del parametro options .AddPackageByUriAsync: Registers an unsigned MSIX package by using the AllowUnsigned property of the options parameter.
  • RegisterPackageByUriAsync: esegue una registrazione del file manifesto del pacchetto Loose.RegisterPackageByUriAsync: Performs a loose package manifest file registration. Se il pacchetto è firmato, la cartella che contiene il manifesto deve includere un file con estensione p7x e un catalogo.If the package is signed, the folder containing the manifest must include a .p7x file and catalog. Se non firmato, è necessario impostare la proprietà AllowUnsigned del parametro options .If unsigned, the AllowUnsigned property of the options parameter must be set.

Requisiti per le app ospitate non firmateRequirements for unsigned hosted apps

  • Gli elementi dell'applicazione o dell' estensione nel manifesto del pacchetto non possono contenere dati di attivazione, ad esempio gli attributi Executable, EntryPointo trustLevel .The Application or Extension elements in the package manifest cannot contain activation data such as the Executable, EntryPoint, or TrustLevel attributes. Questi elementi possono invece contenere solo un attributo uap10: hostid che esprime la dipendenza nell'host e un attributo uap10: Parameters .Instead, these elements can only contain a uap10:HostId attribute that expresses the dependency on the host and a uap10:Parameters attribute.
  • Il pacchetto deve essere un pacchetto principale.The package must be a main package. Non può essere un bundle, un pacchetto del Framework, una risorsa o un pacchetto facoltativo.It cannot be a bundle, framework package, resource, or optional package.

Requisiti per un host che installa e registra un pacchetto dell'app ospitata senza firmaRequirements for a host that installs and registers an unsigned hosted app package

EsempioSample

Per un'app di esempio completamente funzionante che dichiara se stessa come host e quindi registra dinamicamente un pacchetto dell'app ospitata in fase di esecuzione, vedere l' esempio di app ospitata.For a fully functional sample app that declares itself as a host and then dynamically registers a hosted app package at runtime, see the hosted app sample.

HostThe host

L'host è denominato PyScriptEngine.The host is named PyScriptEngine. Si tratta di un wrapper scritto in C# che esegue script Python.This is a wrapper written in C# that runs python scripts. Quando viene eseguito con il -Register parametro, il motore di script installa un'app ospitata contenente uno script Python.When run with the -Register parameter, the script engine installs a hosted app containing a python script. Quando un utente tenta di avviare l'app ospitata appena installata, l'host viene avviato ed esegue lo script NumberGuesser Python.When a user tries to launch the newly installed hosted app, the host is launched and executes the NumberGuesser python script.

Il manifesto del pacchetto per l'app host (il file Package. appxmanifest nella cartella PyScriptEnginePackage) contiene un'estensione uap10: HostRuntime che dichiara l'app come host con ID PythonHost e l'eseguibile PyScriptEngine.exe.The package manifest for the host app (the Package.appxmanifest file in the PyScriptEnginePackage folder) contains a uap10:HostRuntime extension that declares the app as a host with the ID PythonHost and the executable PyScriptEngine.exe.

Nota

In questo esempio, il manifesto del pacchetto è denominato Package. appxmanifest ed è parte di un progetto di creazione pacchetti di applicazioni Windows.In this sample, the package manifest is named Package.appxmanifest and it is part of a Windows Application Packaging Project. Quando questo progetto viene compilato, genera un manifesto denominato AppxManifest.xml e compila il pacchetto MSIX per l'app host.When this project is built, it generates a manifest named AppxManifest.xml and builds the MSIX package for the host app.

App ospitataThe hosted app

L'app ospitata è costituita da uno script Python e da elementi del pacchetto, ad esempio il manifesto del pacchetto.The hosted app consists of a python script and package artifacts such as the package manifest. Non contiene file PE.It doesn’t contain any PE files.

Il manifesto del pacchetto per l'app ospitata (il file NumberGuesser/AppxManifest.xml) contiene gli elementi seguenti:The package manifest for the hosted app (the NumberGuesser/AppxManifest.xml file) contains the following items:

  • L'attributo Publisher dell'elemento Identity contiene OID.2.25.311729368913984317654407730594956997722=1 identificatore, che è necessario per un pacchetto non firmato.The Publisher attribute of the Identity element contains the OID.2.25.311729368913984317654407730594956997722=1 identifer, which is required for an unsigned package.
  • L'attributo uap10: hostid dell'elemento Application identifica PythonHost come host.The uap10:HostId attribute of the Application element identifies PythonHost as its host.

Eseguire l'esempioRun the sample

Per l'esempio è necessaria la versione 10.0.19041.0 o successiva di Windows 10 e il Windows SDK.The sample requires version 10.0.19041.0 or later of Windows 10 and the Windows SDK.

  1. Scaricare l' esempio in una cartella nel computer di sviluppo.Download the sample to a folder on your development computer.

  2. Aprire la soluzione PyScriptEngine. sln in Visual Studio e impostare il progetto PyScriptEnginePackage come progetto di avvio.Open the PyScriptEngine.sln solution in Visual Studio and set the PyScriptEnginePackage project as the startup project.

  3. Compilare il progetto PyScriptEnginePackage .Build the PyScriptEnginePackage project.

  4. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto PyScriptEnginePackage e scegliere Distribuisci.In Solution Explorer, right-click the PyScriptEnginePackage project and choose Deploy.

  5. Aprire una finestra del prompt dei comandi nella directory in cui sono stati copiati i file di esempio ed eseguire il comando seguente per registrare l'app NumberGuesser di esempio (l'app ospitata).Open a Command Prompt window to the directory where you copied the sample files and run the following command to register the sample NumberGuesser app (the hosted app). Passare D:\repos\HostedApps al percorso in cui sono stati copiati i file di esempio.Change D:\repos\HostedApps to the path where you copied the sample files.

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

    Nota

    È possibile eseguire pyscriptengine nella riga di comando perché l'host nell'esempio dichiara un AppExecutionAlias.You can run pyscriptengine on the command line because the host in the sample declares an AppExecutionAlias.

  6. Aprire il menu Start e fare clic su NumberGuesser per eseguire l'app ospitata.Open the Start menu and click NumberGuesser to run the hosted app.