Crear aplicaciones hospedadas
A partir de Windows 10, versión 2004, puedes 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 del 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. Después, el host puede cargar recursos visuales, contenido o LLAMADAS API como 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 que lo 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:
- La forma más común de conceder identidad de paquete a una aplicación de escritorio es empaquetarla en un paquete MSIX.
- En algunos casos, también puede optar por conceder la identidad del paquete mediante la creación de un paquete con ubicación externa (consulte Conceder identidad de paquete mediante el empaquetado con ubicación externa). Esta opción es útil si no puede adoptar MSIX para instalar la aplicación de escritorio.
La extensión uap10:HostRuntime declara el host en su manifiesto de paquete. Esta extensión tiene un atributo Id que se debe asignar 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 en 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 de 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 mediumIL .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 con los atributos del ejemplo anterior se ejecutará como el archivo ejecutable PyScriptEngine.exe en el nivel de confianza mediumIL. |
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 hospedado.
- 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 impide que los paquetes sin firmar entren en conflicto con o suplantan la identidad de un paquete firmado.
Para definir una aplicación hospedada, declare los siguientes elementos en el manifiesto del paquete:
- El elemento uap10:HostRuntimeDependency. Se trata de un elemento secundario del elemento Dependencies .
- Atributo uap10:HostId del elemento Application (para una aplicación) o elemento Extension (para una extensión activable).
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 "NumberGuesser.py"">
</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 de 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. |
Aplicación | 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 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 host 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 hospedado 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 hospedado 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 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 hospedado sin firmar
- El host debe tener la identidad del paquete.
- El host debe tener la funcionalidad restringida packageManagement.
<rescap:Capability Name="packageManagement" />
Ejemplo
Para obtener una aplicación de ejemplo totalmente funcional que se declara como un 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 de paquete de la aplicación host (el archivo Package.appxmanifest en la carpeta PyScriptEnginePackage) contiene una extensión uap10:HostRuntime que declara la aplicación como host con el identificador PythonHost y el archivo 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 de paquete de 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.
Descargue el ejemplo en una carpeta del equipo de desarrollo.
Abra la solución PyScriptEngine.sln en Visual Studio y establezca el proyecto PyScriptEnginePackage como proyecto de inicio.
Compile el proyecto PyScriptEnginePackage .
En Explorador de soluciones, haga clic con el botón derecho en el proyecto PyScriptEnginePackage y elija Implementar.
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
Abra el menú Inicio y haga clic en NumberGuesser para ejecutar la aplicación hospedada.