Crear aplicaciones hospedadasCreate hosted apps

A partir de Windows 10, versión 2004, puede crear aplicaciones hospedadas.Starting in Windows 10, version 2004, you can create hosted apps. Una aplicación hospedada comparte el mismo archivo ejecutable y la misma definición que una aplicación host principal, pero parece y se comporta como una aplicación independiente en el 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.

Las aplicaciones hospedadas son útiles para los escenarios en los que deseas que un componente (como un archivo ejecutable o un archivo de script) se comporte como una aplicación de Windows 10 independiente, pero el componente requiere un proceso de host para poder ejecutarlo.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. Por ejemplo, se puede entregar un script de PowerShell o de Python como una aplicación hospedada que requiere la instalación de un host para poder ejecutarse.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. Una aplicación hospedada puede tener su propio icono de inicio e identidad, así como una profunda integración con las características de Windows 10, como tareas en segundo plano, notificaciones, iconos y destinos de recursos compartidos.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 característica de aplicaciones hospedadas es compatible con varios elementos y atributos del manifiesto de paquete que permiten a una aplicación hospedada usar un ejecutable y una definición en un paquete de aplicación 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. Cuando un usuario ejecuta la aplicación hospedada, el sistema operativo inicia automáticamente el archivo ejecutable del host en la identidad de la aplicación hospedada.When a user runs the hosted app, the OS automatically launches the host executable under the identity of the hosted app. Después, el host puede cargar activos visuales, contenido o llamar a las API como la aplicación hospedada.The host can then load visual assets, content, or call APIs as the hosted app. La aplicación hospedada obtiene la intersección de las funciones declaradas entre el host y la aplicación hospedada.The hosted app gets the intersection of capabilities declared between the host and hosted app. Esto significa que una aplicación hospedada no puede solicitar más capacidades de las que proporciona el host.This means that a hosted app cannot ask for more capabilities than what the host provides.

Definir un hostDefine a host

El host es el ejecutable principal o el proceso en tiempo de ejecución de la aplicación hospedada.The host is the main executable or runtime process for the hosted app. Actualmente, los únicos hosts admitidos son las aplicaciones de escritorio (.NET o C++/Win32) que tienen la identidad del paquete.Currently, the only supported hosts are desktop apps (.NET or C++/Win32) that have package identity. Las aplicaciones UWP no se admiten como hosts en este momento.UWP apps are not supported as hosts at this time. Hay varias maneras de que una aplicación de escritorio tenga la identidad del paquete:There are several ways for a desktop app to have package identity:

  • La forma más común de conceder la identidad del paquete a una aplicación de escritorio es empaquetarla en un paquete MSIX.The most common way to grant package identity to a desktop app is by packaging it in an MSIX package.
  • En algunos casos, también puede optar por conceder la identidad del paquete mediante la creación de un paquete disperso.In some cases, you may alternatively choose to grant package identity by creating a sparse package. Esta opción es útil si no puede adoptar el empaquetado de MSIX para implementar la aplicación de escritorio.This option is useful if you are unable to adopt MSIX packaging for deploying your desktop app.

La extensión uap10: HostRuntime declara el host en el manifiesto del paquete.The host is declared in its package manifest by the uap10:HostRuntime extension. Esta extensión tiene un atributo de identificador al que se debe asignar un valor al que también se hace referencia en el manifiesto del paquete de la aplicación hospedada.This extension has an Id attribute that must be assigned a value that is also referenced by the package manifest for the hosted app. Cuando se activa la aplicación hospedada, el host se inicia en la identidad de la aplicación hospedada y puede cargar contenido o archivos binarios desde el paquete de la aplicación hospedada.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.

En el ejemplo siguiente se muestra cómo definir un host en un manifiesto del paquete.The following example demonstrates how to define a host in a package manifest. La extensión uap10: HostRuntime está en todo el paquete y, por lo tanto, se declara como un elemento secundario del elemento del paquete .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>

Tome nota de estos detalles importantes sobre los siguientes elementos.Make note of these important details about the following elements.

ElementoElement DetallesDetails
uap10:Extensionuap10:Extension La windows.hostRuntime categoría declara una extensión de todo el paquete que define la información en tiempo de ejecución que se va a usar al activar una aplicación hospedada.The windows.hostRuntime category declares a package-wide extension that defines the runtime information to be used when activating a hosted app. Una aplicación hospedada se ejecutará con las definiciones declaradas en la extensión.A hosted app will run with the definitions declared in the extension. Al usar la aplicación host declarada en el ejemplo anterior, una aplicación hospedada se ejecutará como PyScriptEngine.exe ejecutable en el nivel de confianza 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.

Los atributos Executable, uap10: RuntimeBehaviory uap10: trustLevel especifican el nombre del archivo binario del proceso de host en el paquete y cómo se ejecutarán las aplicaciones hospedadas.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. Por ejemplo, una aplicación hospedada que use los atributos del ejemplo anterior se ejecutará como el ejecutable PyScriptEngine.exe en el nivel de confianza 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 El atributo ID declara el identificador único de esta aplicación host específica en el paquete.The Id attribute declares the unique identifier of this specific host app in the package. Un paquete puede tener varias aplicaciones host y cada una debe tener un elemento uap10: HostRuntime con un identificadorúnico.A package can have multiple host apps, and each must have a uap10:HostRuntime element with a unique Id.

Declarar una aplicación hospedadaDeclare a hosted app

Una aplicación hospedada declara una dependencia del paquete en un host.A hosted app declares a package dependency on a host. La aplicación hospedada aprovecha el identificador del host (es decir, el atributo ID de la extensión uap10: HostRuntime en el paquete host) para la activación en lugar de especificar un ejecutable de punto de entrada en su propio paquete.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. Normalmente, la aplicación hospedada contiene contenido, recursos visuales, scripts o archivos binarios a los que puede acceder el host.The hosted app typically contains content, visual assets, scripts, or binaries that may be accessed by the host. El valor de TargetDeviceFamily del paquete de la aplicación hospedada debe tener como destino el mismo valor que el host.The TargetDeviceFamily value in the hosted app package should target the same value as the host.

Los paquetes de aplicaciones hospedadas se pueden firmar o sin firmar:Hosted app packages can be signed or unsigned:

  • Los paquetes firmados pueden contener archivos ejecutables.Signed packages may contain executable files. Esto resulta útil en escenarios que tienen un mecanismo de extensión binaria, que permite al host cargar un archivo DLL o un componente registrado en el paquete de la aplicación hospedada.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.
  • Los paquetes sin firmar solo pueden contener archivos no ejecutables.Unsigned packages can only contain non-executable files. Esto resulta útil en escenarios en los que el host solo necesita cargar imágenes, activos, contenido o archivos de scripts.This is useful in scenarios where the host only needs to load images, assets and content or script files. Los paquetes sin firmar deben incluir un OID valor especial en su elemento Identity o no podrán registrarse.Unsigned packages must include a special OID value in their Identity element or they won’t be allowed to register. Esto evita que los paquetes sin firmar entren en conflicto con o suplantar la identidad de un paquete firmado.This prevents unsigned packages from conflicting with or spoofing the identity of a signed package.

Para definir una aplicación hospedada, declare los siguientes elementos en el manifiesto del paquete:To define a hosted app, declare the following items in the package manifest:

En el ejemplo siguiente se muestran las secciones pertinentes de un manifiesto del paquete para una aplicación hospedada sin firmar.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>

Tome nota de estos detalles importantes sobre los siguientes elementos.Make note of these important details about the following elements.

ElementoElement DetallesDetails
IdentidadIdentity Dado que el paquete de aplicación hospedada en este ejemplo está sin signo, el atributo de publicador debe incluir la OID.2.25.311729368913984317654407730594956997722=1 cadena.Because the hosted app package in this example is unsigned, the Publisher attribute must include the OID.2.25.311729368913984317654407730594956997722=1 string. Esto garantiza que el paquete sin firmar no puede suplantar la identidad de un paquete firmado.This ensures that the unsigned package cannot spoof the identity of a signed package.
TargetDeviceFamilyTargetDeviceFamily El atributo MinVersion debe especificar 10.0.19041.0 o una versión posterior del sistema operativo.The MinVersion attribute must specify 10.0.19041.0 or a later OS version.
uap10:HostRuntimeDependencyuap10:HostRuntimeDependency Este elemento de elemento declara una dependencia en el paquete de la aplicación host.This element element declares a dependency on the host app package. Consta del nombre y el publicador del paquete de host y el MinVersion del que depende.This consists of the Name and Publisher of the host package, and the MinVersion it depends on. Estos valores se pueden encontrar en el elemento Identity del paquete host.These values can be found under the Identity element in the host package.
AplicaciónApplication El atributo uap10: HostId expresa la dependencia en el host.The uap10:HostId attribute expresses the dependency on the host. El paquete de la aplicación hospedada debe declarar este atributo en lugar de los atributos de archivo ejecutable y de punto de entrada habituales para una aplicación o un elemento de extensión .The hosted app package must declare this attribute instead of the usual Executable and EntryPoint attributes for an Application or Extension element. Como resultado, la aplicación hospedada hereda los atributos Executable, EntryPoint y Runtime del host con el valor HostId correspondiente.As a result, the hosted app inherits the Executable, EntryPoint and runtime attributes from the host with the corresponding HostId value.

El atributo uap10: Parameters especifica los parámetros que se pasan a la función de punto de entrada del ejecutable del host.The uap10:Parameters attribute specifies parameters that are passed to the entry point function of the host executable. Dado que el host necesita saber qué hacer con estos parámetros, hay un contrato implícito entre el host y la aplicación hospedada.Because the host needs to know what to do with these parameters, there is an implied contract between the host and hosted app.

Registrar un paquete de aplicación hospedada sin firmar en tiempo de ejecuciónRegister an unsigned hosted app package at run time

Una ventaja de la extensión uap10: HostRuntime es que permite a un host generar dinámicamente un paquete de aplicación hospedada en tiempo de ejecución y registrarlo mediante la API de PackageManager , sin necesidad de 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. Esto permite a un host generar dinámicamente el contenido y el manifiesto para el paquete de la aplicación hospedada y, a continuación, registrarlo.This enables a host to dynamically generate the content and manifest for the hosted app package and then register it.

Use los métodos siguientes de la clase PackageManager para registrar un paquete de aplicación hospedada sin firmar.Use the following methods of the PackageManager class to register an unsigned hosted app package. Estos métodos están disponibles a partir de Windows 10, versión 2004.These methods are available starting in Windows 10, version 2004.

  • AddPackageByUriAsync: registra un paquete MSIX sin firmar mediante la propiedad AllowUnsigned del parámetro Options .AddPackageByUriAsync: Registers an unsigned MSIX package by using the AllowUnsigned property of the options parameter.
  • RegisterPackageByUriAsync: realiza un registro de archivo de manifiesto del paquete suelto.RegisterPackageByUriAsync: Performs a loose package manifest file registration. Si el paquete está firmado, la carpeta que contiene el manifiesto debe incluir un archivo. p7x y un catálogo.If the package is signed, the folder containing the manifest must include a .p7x file and catalog. Si es sin signo, se debe establecer la propiedad AllowUnsigned del parámetro Options .If unsigned, the AllowUnsigned property of the options parameter must be set.

Requisitos para las aplicaciones hospedadas sin firmarRequirements for unsigned hosted apps

  • Los elementos de la aplicación o la extensión del manifiesto del paquete no pueden contener datos de activación, como los atributos ejecutable, EntryPointo trustLevel .The Application or Extension elements in the package manifest cannot contain activation data such as the Executable, EntryPoint, or TrustLevel attributes. En su lugar, estos elementos solo pueden contener un atributo uap10: HostId que exprese la dependencia en el host y un atributo Uap10: Parameters .Instead, these elements can only contain a uap10:HostId attribute that expresses the dependency on the host and a uap10:Parameters attribute.
  • El paquete debe ser un paquete principal.The package must be a main package. No puede ser una agrupación, paquete de marco, recurso o paquete opcional.It cannot be a bundle, framework package, resource, or optional package.

Requisitos para un host que instala y registra un paquete de aplicación hospedada sin firmarRequirements for a host that installs and registers an unsigned hosted app package

EjemploSample

Para una aplicación de ejemplo totalmente funcional que se declare como un host y, a continuación, registre dinámicamente un paquete de aplicación hospedada en tiempo de ejecución, consulte el ejemplo de aplicación hospedada.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.

El hostThe host

El host se denomina PyScriptEngine.The host is named PyScriptEngine. Se trata de un contenedor escrito en C# que ejecuta scripts de Python.This is a wrapper written in C# that runs python scripts. Cuando se ejecuta con el -Register parámetro, el motor de scripts instala una aplicación hospedada que contiene un script de Python.When run with the -Register parameter, the script engine installs a hosted app containing a python script. Cuando un usuario intenta iniciar la aplicación hospedada recién instalada, el host se inicia y ejecuta el script de Python de NumberGuesser .When a user tries to launch the newly installed hosted app, the host is launched and executes the NumberGuesser python script.

El manifiesto del paquete para la aplicación host (el archivo package. appxmanifest de la carpeta PyScriptEnginePackage) contiene una extensión uap10: HostRuntime que declara la aplicación como un host con el identificador PythonHost y el PyScriptEngine.exeejecutable.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

En este ejemplo, el manifiesto del paquete se denomina package. appxmanifest y forma parte de un proyectode paquete de aplicación de Windows.In this sample, the package manifest is named Package.appxmanifest and it is part of a Windows Application Packaging Project. Cuando se compila este proyecto, se genera un manifiesto denominado AppxManifest.xml y se compila el paquete MSIX para la aplicación host.When this project is built, it generates a manifest named AppxManifest.xml and builds the MSIX package for the host app.

La aplicación hospedadaThe hosted app

La aplicación hospedada consta de un script de Python y artefactos de paquete, como el manifiesto del paquete.The hosted app consists of a python script and package artifacts such as the package manifest. No contiene ningún archivo PE.It doesn’t contain any PE files.

El manifiesto del paquete para la aplicación hospedada (el archivo NumberGuesser/AppxManifest.xml) contiene los siguientes elementos:The package manifest for the hosted app (the NumberGuesser/AppxManifest.xml file) contains the following items:

  • El atributo Publisher del elemento Identity contiene el OID.2.25.311729368913984317654407730594956997722=1 identificador, que es necesario para un paquete sin firmar.The Publisher attribute of the Identity element contains the OID.2.25.311729368913984317654407730594956997722=1 identifer, which is required for an unsigned package.
  • El atributo uap10: HostId del elemento Application identifica PythonHost como su host.The uap10:HostId attribute of the Application element identifies PythonHost as its host.

Ejecución del ejemploRun the sample

El ejemplo requiere la versión 10.0.19041.0 o posterior de Windows 10 y el Windows SDK.The sample requires version 10.0.19041.0 or later of Windows 10 and the Windows SDK.

  1. Descargue el ejemplo en una carpeta en el equipo de desarrollo.Download the sample to a folder on your development computer.

  2. Abra la solución PyScriptEngine. sln en Visual Studio y establezca el proyecto PyScriptEnginePackage como proyecto de inicio.Open the PyScriptEngine.sln solution in Visual Studio and set the PyScriptEnginePackage project as the startup project.

  3. Compile el proyecto PyScriptEnginePackage .Build the PyScriptEnginePackage project.

  4. En Explorador de soluciones, haga clic con el botón derecho en el proyecto PyScriptEnginePackage y elija implementar.In Solution Explorer, right-click the PyScriptEnginePackage project and choose Deploy.

  5. Abra una ventana del símbolo del sistema en el directorio donde copió los archivos de ejemplo y ejecute el siguiente comando para registrar la aplicación de NumberGuesser de ejemplo (la aplicación hospedada).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). Cambie D:\repos\HostedApps a la ruta de acceso donde copió los archivos de ejemplo.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

    Puede ejecutar pyscriptengine en la línea de comandos porque el host del ejemplo declara un AppExecutionAlias.You can run pyscriptengine on the command line because the host in the sample declares an AppExecutionAlias.

  6. Abra el menú Inicio y haga clic en NumberGuesser para ejecutar la aplicación hospedada.Open the Start menu and click NumberGuesser to run the hosted app.