Cómo se ejecutan las aplicaciones de escritorio empaquetadas en Windows

En este tema se describen los tipos de aplicaciones de escritorio para los que puede crear un paquete de aplicaciones de Windows, junto con algunos comportamientos del sistema operativo (SO) y otras especificaciones, que son importantes y hay que tener en cuenta. Veremos los detalles de los siguientes artículos (como veremos, el comportamiento específico depende del tipo de aplicación):

Tipos de aplicaciones de escritorio

Hay dos tipos de aplicaciones de escritorio que puede crear y empaquetar. El tipo de la aplicación se declara en el manifiesto del paquete de la aplicación mediante el atributo uap10:RuntimeBehavior del elemento Application:

  • Un tipo incluye aplicaciones WinUI 3 (que usan el SDK de aplicaciones para Windows) y las aplicaciones de Puente de dispositivo de escritorio (Centennial). Declarado con uap10:RuntimeBehavior="packagedClassicApp".
  • El otro tipo representa otras variantes de aplicaciones Win32, incluidas las aplicaciones empaquetadas con ubicación externa. Declarado con uap10:RuntimeBehavior="win32App".

Las aplicaciones de plataforma universal de Windows (UWP) (uap10:RuntimeBehavior="windowsApp") también se empaquetan; pero este tema no trata estos elementos.

Y, a continuación, el atributo uap10:TrustLevel (del mismo elemento Application) determina si el proceso de la aplicación empaquetada se ejecuta dentro de un contenedor de aplicaciones.

  • Una aplicación de plena confianza. Declarado con uap10:TrustLevel="mediumIL".
  • Una aplicación appContainer. Declarado con uap10:TrustLevel="appContainer". Se ejecuta dentro de un contenedor de aplicaciones ligero (y, por tanto, se aísla mediante el sistema de archivos y la virtualización del registro). Para obtener más información, consulte Aplicaciones de MSIX AppContainer.

Importante

Para obtener más detalles, dependencias y requisitos de capacidad, consulte la documentación de esos dos atributos en Application. Vea también uap10 se introdujo en Windows 10, versión 2004 (10.0; compilación 19041).

El propósito del empaquetado y los contenedores de aplicaciones

El propósito de empaquetar la aplicación es concederle la identidad del paquete en el momento de ejecución. La identidad del paquete es necesaria para determinadas características de Windows (consulte Características que requieren la identidad del paquete). Puede empaquetar todas las combinaciones de tipos de aplicación descritas anteriormente (y, por tanto, beneficiarse de la identidad del paquete).

Pero, un objetivo clave de una aplicación appContainer es separar el estado de la aplicación del estado del sistema lo máximo posible y, al mismo tiempo, mantener la compatibilidad con otras aplicaciones. Para lograrlo, Windows detecta y redirige ciertos cambios que realiza en el sistema de archivos y en el registro en tiempo de ejecución (lo que se conoce como virtualización). Lo señalizaremos cuando una sección solo se aplique a las aplicaciones virtualizadas.

Instalación

Los paquetes de aplicaciones se instalan por usuario en lugar de en todo el sistema. La ubicación predeterminada de los nuevos paquetes en una nueva máquina está en C:\Program Files\WindowsApps\<package_full_name>, con el ejecutable denominado app_name.exe. Pero los paquetes se pueden instalar en otros lugares; por ejemplo, los comandos Start de Visual Studio usan el $(OutDir) del proyecto.

Después de la implementación, el sistema operativo (OS) marca los archivos del paquete como de solo lectura y los bloquea completamente. Windows evita que las aplicaciones se inicien en caso de que se manipulen estos archivos.

La ubicación C:\Program Files\WindowsApps es lo que se conoce como PackageVolume. Esa ubicación es el PackageVolume predeterminado con el que Windows realiza sus tareas de proveedor; pero puede crear un PackageVolume en cualquier unidad y en cualquier ruta. Además, no todos los paquetes se instalan en un PackageVolume (vea el ejemplo de Visual Studio anterior).

Sistema de archivos

El sistema operativo admite distintos niveles de operaciones del sistema de archivos para las aplicaciones de escritorio empaquetadas, en función de la ubicación de la carpeta.

Optimizado para el dispositivo

Con el fin de evitar la duplicación de archivos (para optimizar el espacio de almacenamiento en disco y reducir el ancho de banda necesario al descargar archivos) el sistema operativo saca provecho del almacenamiento único y el vínculo físico de los archivos. Cuando un usuario descarga un paquete MSIX, el AppxManifest.xml se usa para determinar si los datos que contiene dicho paquete ya existen en el disco de una instalación de paquete anterior. Si el mismo archivo existe en varios paquetes MSIX, el sistema operativo almacena el archivo compartido en el disco una sola vez y crea vínculos físicos desde ambos paquetes al archivo compartido. Dado que los archivos se descargan en bloques de 64 KB, aunque en el disco exista un porcentaje de un archivo que se está descargando, solo se descarga el incremento diferente. Así, se reduce el ancho de banda usado para la descarga.

Operaciones de AppData en Windows 10, versión 1903 y versiones posteriores

Esta sección solo se aplica a las aplicaciones virtualizadas.

Todos los archivos y carpetas recién creados en la carpeta AppData del usuario (p. ej., C:\Users\<user_name>\AppData) se escriben en una ubicación privada por usuario y por aplicación, pero se combinan en el momento de ejecución para mostrarse en la ubicación AppData real. Esto permite cierto grado de separación de estados para los artefactos que solo usa la propia aplicación y, a su vez, que el sistema limpie esos archivos cuando se desinstala la aplicación.

Las modificaciones en los archivos existentes en la carpeta AppData del usuario pueden proporcionar un mayor grado de compatibilidad e interactividad entre las aplicaciones y el sistema operativo. Esto reduce el deterioro del sistema porque el sistema operativo es consciente de cada cambio de archivo o directorio realizado por una aplicación. La separación de estados también permite que las aplicaciones de escritorio empaquetadas reanuden la actividad en el punto en el que se quedó la versión no empaquetada de la misma aplicación. Tenga en cuenta que el sistema operativo no es compatible con una carpeta del sistema de archivos virtual (VFS) para la carpeta AppData del usuario.

Operaciones de AppData en sistemas operativos anteriores a Windows 10, versión 1903

Esta sección solo se aplica a las aplicaciones virtualizadas.

Todo lo que se escribe en la carpeta AppData del usuario (por ejemplo, C:\Users\<user_name>\AppData), como las operaciones de creación, eliminación y actualización, se copia al escribir a una ubicación privada por usuario y por aplicación. Esto crea el efecto de que la aplicación empaquetada está editando la verdadera carpeta AppData cuando realmente está modificando una copia privada. Al redireccionar las escrituras de este modo, el sistema puede realizar un seguimiento de todas las modificaciones de archivos que realiza la aplicación. Esto permite que el sistema limpie esos archivos cuando se desinstala la aplicación; por lo tanto, se reduce el "deterioro" del sistema y se ofrece una mejor experiencia de eliminación de aplicación para el usuario.

Directorio de trabajo y archivos de aplicación

Esta sección solo se aplica a las aplicaciones virtualizadas.

Además de redirigir AppData, las carpetas conocidas de Windows (System32, Program Files (x86), etcétera) se combinan dinámicamente con los directorios correspondientes del paquete de la aplicación. Cada paquete contiene una carpeta denominada VFS en su raíz. Las lecturas de directorios o archivos en el directorio VFS se combinan en el momento de ejecución con sus respectivos homólogos nativos. Por ejemplo, una aplicación podría contener C:\Program Files\WindowsApps\<package_full_name>\VFS\SystemX86\vc10.dll como parte de su paquete de aplicación, pero el archivo parecería estar instalado en C:\Windows\System32\vc10.dll. Esto mantiene la compatibilidad con las aplicaciones de escritorio que esperan que los archivos se encuentren en ubicaciones distintas del paquete.

No se permiten las escrituras en archivos o carpetas del paquete de la aplicación. El sistema operativo ignora las escrituras en archivos y carpetas que no forman parte del paquete, y se permiten si el usuario tiene permisos.

Operaciones comunes de sistema de archivos

En la siguiente tabla de referencia breve se muestran las operaciones comunes del sistema de archivos y cómo las controla el sistema operativo.

Operación Resultado Ejemplo
Leer o enumerar un archivo o carpeta de conocidos de Windows Combinación dinámica de C:\Program Files\<package_full_name>\VFS\<well_known_folder> con el homólogo del sistema local. La lectura de C:\Windows\System32 aporta los contenidos de C:\Windows\System32 más los contenidos de C:\Program Files\WindowsApps\<package_full_name>\VFS\SystemX86.
Escribir en AppData Windows 10, versión 1903 y posteriores: los nuevos archivos y carpetas creados en los siguientes directorios se redirigen a una ubicación privada por usuario y por paquete:
  • Local
  • Local\Microsoft
  • Movilidad
  • Roaming\Microsoft
  • Roaming\Microsoft\Windows\Start Menu\Programs
En respuesta a un comando de apertura de archivo, el sistema operativo abrirá primero el archivo de la ubicación por usuario y por paquete. Si no existe esta ubicación, el sistema operativo intentará abrir el archivo desde la ubicación AppData real. Si el archivo se abre desde la ubicación AppData real, no se producirá ninguna virtualización para ese archivo. Se permite la eliminación de archivos en AppData si el usuario cuenta con los permisos necesarios.

Versiones anteriores a Windows 10, versión 1903: copia en escritura a una ubicación por usuario y por aplicación.

AppData suele ser C:\Users\<user_name>\AppData:
Escribir dentro del paquete No permitido. El paquete es de solo lectura. No se permiten escrituras en C:\Program Files\WindowsApps\<package_full_name>.
Escritura fuera del paquete Se permite si el usuario tiene permisos. Se permite una escritura en C:\Windows\System32\foo.dll si el paquete no contiene C:\Program Files\WindowsApps\<package_full_name>\VFS\SystemX86\foo.dll y el usuario tiene permisos.

Ubicaciones VFS empaquetadas

Esta sección solo se aplica a las aplicaciones virtualizadas.

En esta tabla se muestra donde se superponen los archivos como parte del paquete en el sistema para la aplicación. La aplicación considerará que estos archivos están en las ubicaciones del sistema que figuran en la lista, pero, en realidad, se encuentran en las ubicaciones redirigidas dentro de C:\Program Files\WindowsApps\<package_full_name>\VFS. Las ubicaciones FOLDERID proceden de las constantes KNOWNFOLDERID.

Ubicación del sistema Ubicación redirigida (en [<package_root>]\VFS) Válido en arquitecturas
FOLDERID_SystemX86 SystemX86 x86, amd64
FOLDERID_System SystemX64 amd64
FOLDERID_ProgramFilesX86 ProgramFilesX86 x86, amd6
FOLDERID_ProgramFilesX64 ProgramFilesX64 amd64
FOLDERID_ProgramFilesCommonX86 ProgramFilesCommonX86 x86, amd64
FOLDERID_ProgramFilesCommonX64 ProgramFilesCommonX64 amd64
FOLDERID_Windows Windows x86, amd64
FOLDERID_ProgramData AppData común x86, amd64
FOLDERID_System\catroot AppVSystem32Catroot x86, amd64
FOLDERID_System\catroot2 AppVSystem32Catroot2 x86, amd64
FOLDERID_System\drivers\etc AppVSystem32DriversEtc x86, amd64
FOLDERID_System\driverstore AppVSystem32Driverstore x86, amd64
FOLDERID_System\logfiles AppVSystem32Logfiles x86, amd64
FOLDERID_System\spool AppVSystem32Spool x86, amd64

Registro

Esta sección (y sus subsecciones) solo se aplican a las aplicaciones virtualizadas.

Los paquetes de aplicaciones contienen un archivo registry.dat, que actúa como el equivalente lógico de HKLM\Software en el registro real. En el momento de ejecución, este registro virtual combina el contenido de este subárbol en el subárbol del sistema nativo para proporcionar una vista individual de ambos. Por ejemplo, si registry.dat contiene una sola clave Foo, una lectura de HKLM\Software en el momento de ejecución también parecerá contener Foo (además de todas las claves del sistema nativo).

Aunque los paquetes de MSIX incluyen claves HKLM y HKCU, se tratan de forma diferente. Solo las claves de HKLM\Software forman parte del paquete; las claves de HKCU u otras partes del registro, no forman parte del paquete. No se permiten escrituras en claves o valores del paquete. Las escrituras en las claves o los valores que no forman parte del paquete se permiten si el usuario tiene permisos.

Todas las escrituras en HKCU se copian en escritura en una ubicación privada por usuario y por aplicación. Tradicionalmente, los desinstaladores no pueden limpiar HKEY_CURRENT_USER porque los datos del registro para los usuarios que han cerrado su sesión están desmontados y no están disponibles.

Todas las escrituras se conservan durante la actualización del paquete y únicamente se eliminan cuando la aplicación se quita por completo.

Operaciones comunes del registro

La mayor parte de esta sección solo se aplica a las aplicaciones virtualizadas.

En la siguiente tabla de referencia breve se muestran las operaciones del registro y cómo las controla el sistema operativo.

Operación Resultado Ejemplo
Leer o enumerar HKLM\Software Combinación dinámica del subárbol del paquete con el homólogo del sistema local. Si registry.dat contiene una sola clave Foo, en el momento de ejecución, una lectura de HKLM\Software muestra el contenido de HKLM\Software y HKLM\Software\Foo.
Escrituras en HKCU Copiado en escritura en una ubicación privada por usuario y por aplicación. Igual que AppData para los archivos.
Escritura dentro del paquete. No permitido. El paquete es de solo lectura. No se permiten escrituras en HKLM\Software si existe una clave o valor correspondiente en el subárbol del paquete.
Escritura fuera del paquete Ignoradas por el sistema operativo. Se permite si el usuario tiene permisos. Las escrituras en HKLM\Software se permiten siempre que no exista una clave o un valor correspondiente en el subárbol del paquete y el usuario tenga los permisos de acceso correctos.

Desinstalación

Esta sección solo se aplica a las aplicaciones virtualizadas.

Cuando el usuario desinstala un paquete, se quitan todos los archivos y carpetas ubicados en C:\Program Files\WindowsApps\<package_full_name>, así como las escrituras redirigidas a AppData o el registro capturado durante el proceso de empaquetado.