Crear aplicaciones hospedadas

A partir de Windows 10, versión 2004, puede crear aplicaciones hospedadas. Una aplicación hospedada comparte el mismo archivo ejecutable y definición que una aplicación host primaria, pero parece y se comporta como una aplicación independiente en el sistema.

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. Por ejemplo, un script de PowerShell o Python podría entregarse como una aplicación hospedada que requiere que se instale un host para poder ejecutarse. 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.

La característica de aplicaciones hospedadas es compatible con varios elementos y atributos en el manifiesto del paquete que permiten que una aplicación hospedada use un archivo ejecutable y una definición en un paquete de aplicación host. 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. A continuación, el host puede cargar recursos visuales, contenido o llamar a las API como la aplicación hospedada. La aplicación hospedada obtiene la intersección de las funcionalidades declaradas entre el host y la aplicación hospedada. Esto significa que una aplicación hospedada no puede solicitar más funcionalidades de las que proporciona el host.

Definición de un host

El host es el proceso principal ejecutable o en tiempo de ejecución de la aplicación hospedada. Actualmente, los únicos hosts admitidos son aplicaciones de escritorio (escritorio de .NET o C++) que tienen identidad de paquete. Hay varias maneras de que una aplicación de escritorio tenga la identidad del paquete:

El host se declara en su manifiesto de paquete mediante la extensión uap10:HostRuntime . Esta extensión tiene un atributo Id que debe asignarse a un valor al que también hace referencia el manifiesto del paquete para la aplicación hospedada. Cuando se activa la aplicación hospedada, el host se inicia bajo la identidad de la aplicación hospedada y puede cargar contenido o archivos binarios desde el paquete de la aplicación hospedada.

En el ejemplo siguiente se muestra cómo definir un host en un manifiesto de paquete. La extensión uap10:HostRuntime es de todo el paquete y, por tanto, se declara como elemento secundario del elemento Package .

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

Elemento Detalles
uap10:Extension La windows.hostRuntime categoría declara una extensión para todo el paquete que define la información en tiempo de ejecución que se usará al activar una aplicación hospedada. Una aplicación hospedada se ejecutará con las definiciones declaradas en la extensión. Al usar la aplicación host declarada en el ejemplo anterior, una aplicación hospedada se ejecutará como el archivo ejecutable PyScriptEngine.exe en el nivel de confianza medioIL .

Los atributos Ejecutable, uap10:RuntimeBehavior y uap10:TrustLevel especifican el nombre del archivo binario del proceso de host en el paquete y cómo se ejecutarán las aplicaciones hospedadas. Por ejemplo, una aplicación hospedada que usa los atributos del ejemplo anterior se ejecutará como el archivo ejecutable PyScriptEngine.exe en el nivel de confianza medioIL.
uap10:HostRuntime El atributo Id declara el identificador único de esta aplicación host específica en el paquete. Un paquete puede tener varias aplicaciones host y cada una debe tener un elemento uap10:HostRuntime con un identificador único.

Declaración de una aplicación hospedada

Una aplicación hospedada declara una dependencia de paquete en un 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. La aplicación hospedada normalmente contiene contenido, recursos visuales, scripts o archivos binarios a los que puede acceder el host. El valor TargetDeviceFamily del paquete de la aplicación hospedada debe tener como destino el mismo valor que el host.

Los paquetes de aplicaciones hospedados se pueden firmar o anular la firma:

  • Los paquetes firmados pueden contener archivos ejecutables. Esto es ú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 aplicación hospedada.
  • En la mayoría de los escenarios, el paquete sin firmar contendrá contenido ejecutable. Pero un paquete sin firmar que contiene solo archivos no ejecutables es útil en escenarios en los que el host solo necesita cargar imágenes, recursos y archivos de contenido o script. Los paquetes sin firmar deben incluir un valor especial OID en su elemento Identity o no podrán registrarse. Esto evita que los paquetes sin firmar entren en conflicto con o suplantación de identidad de un paquete firmado.

Para definir una aplicación hospedada, declare los siguientes elementos en el manifiesto del paquete:

En el ejemplo siguiente se muestran las secciones pertinentes de un manifiesto de paquete para una aplicación hospedada sin firmar.

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

Elemento Detalles
Identidad Dado que el paquete de la aplicación hospedada en este ejemplo no está firmado, el atributo Publisher debe incluir la OID.2.25.311729368913984317654407730594956997722=1 cadena. Esto garantiza que el paquete sin firmar no pueda suplantar la identidad de un paquete firmado.
TargetDeviceFamily El atributo MinVersion debe especificar 10.0.19041.0 o una versión posterior del sistema operativo.
uap10:HostRuntimeDependency Este elemento declara una dependencia en el paquete de la aplicación host. Esto consta del nombre y el publicador del paquete host, y el minversion del que depende. Estos valores se pueden encontrar en el elemento Identity del paquete host.
Application El atributo uap10:HostId expresa la dependencia en el host. El paquete de la aplicación hospedada debe declarar este atributo en lugar de los atributos de Ejecutable y EntryPoint habituales para un elemento Application o Extension . Como resultado, la aplicación hospedada hereda los atributos Ejecutable, EntryPoint y runtime del host con el valor HostId correspondiente.

El atributo uap10:Parameters especifica los parámetros que se pasan a la función de punto de entrada del ejecutable del host. Dado que el host debe saber qué hacer con estos parámetros, hay un contrato implícito entre el host y la aplicación hospedada.

Registro de un paquete de aplicación hospedada sin firmar en tiempo de ejecución

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 PackageManager , sin necesidad de firmarlo. 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.

Use los métodos siguientes de la clase PackageManager para registrar un paquete de aplicación hospedado sin firmar. Estos métodos están disponibles a partir de Windows 10, versión 2004.

  • AddPackageByUriAsync: registra un paquete MSIX sin firmar mediante la propiedad AllowUnsigned del parámetro options .
  • RegisterPackageByUriAsync: realiza un registro de archivo de manifiesto de paquete flexible. Si el paquete está firmado, la carpeta que contiene el manifiesto debe incluir un archivo .p7x y un catálogo. Si no está firmado, se debe establecer la propiedad AllowUnsigned del parámetro options .

Requisitos para aplicaciones hospedadas sin firmar

  • Los elementos Application o Extension del manifiesto del paquete no pueden contener datos de activación como los atributos Ejecutable, EntryPoint o TrustLevel . En su lugar, estos elementos solo pueden contener un atributo uap10:HostId que expresa la dependencia en el host y un atributo uap10:Parameters .
  • El paquete debe ser un paquete principal. No puede ser un paquete, un paquete de marco, un recurso o un paquete opcional.

Requisitos para un host que instala y registra un paquete de aplicación hospedada sin firmar

Ejemplo

Para obtener una aplicación de ejemplo totalmente funcional que se declara como host y, a continuación, registra dinámicamente un paquete de aplicación hospedada en tiempo de ejecución, consulte el ejemplo de aplicación hospedada.

El host

El host se denomina PyScriptEngine. Se trata de un contenedor escrito en C# que ejecuta scripts de Python. Cuando se ejecuta con el -Register parámetro , el motor de script instala una aplicación hospedada que contiene un script de Python. Cuando un usuario intenta iniciar la aplicación hospedada recién instalada, el host se inicia y ejecuta el script de Python NumberGuesser .

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 host con el identificador PythonHost y el ejecutable PyScriptEngine.exe.

Nota

En este ejemplo, el manifiesto del paquete se denomina Package.appxmanifest y forma parte de un proyecto de empaquetado de aplicaciones de Windows. Cuando se compila este proyecto, genera un manifiesto denominado AppxManifest.xml y compila el paquete MSIX para la aplicación host.

La aplicación hospedada

La aplicación hospedada consta de un script de Python y artefactos de paquete, como el manifiesto del paquete. No contiene ningún archivo PE.

El manifiesto del paquete para la aplicación hospedada (el archivo NumberGuesser/AppxManifest.xml) contiene los siguientes elementos:

  • El atributo Publisher del elemento Identity contiene el OID.2.25.311729368913984317654407730594956997722=1 identificador, que es necesario para un paquete sin firmar.
  • El atributo uap10:HostId del elemento Application identifica PythonHost como su host.

Ejecución del ejemplo

El ejemplo requiere la versión 10.0.19041.0 o posterior de Windows 10 y Windows SDK.

  1. Descargue el ejemplo en una carpeta del equipo de desarrollo.

  2. Abra la solución PyScriptEngine.sln en Visual Studio y establezca el proyecto PyScriptEnginePackage como proyecto de inicio.

  3. Compile el proyecto PyScriptEnginePackage .

  4. En Explorador de soluciones, haga clic con el botón derecho en el proyecto PyScriptEnginePackage y elija Implementar.

  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 NumberGuesser de ejemplo (la aplicación hospedada). Cambie D:\repos\HostedApps a la ruta de acceso donde copió los archivos de ejemplo.

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

    Nota

    Puede ejecutarse pyscriptengine en la línea de comandos porque el host del ejemplo declara una AppExecutionAlias.

  6. Abra el menú Inicio y haga clic en NumberGuesser para ejecutar la aplicación hospedada.