Cómo se ejecutan las aplicaciones de escritorio empaquetadas en WindowsUnderstanding how packaged desktop apps run on Windows

En este artículo se proporciona un análisis más detallado sobre lo que sucede con los archivos y entradas del registro cuando se crea un paquete de aplicación de Windows para una aplicación de escritorio.This article provides a deeper dive on what happens to files and registry entries when you create a Windows app package for your desktop application.

Un objetivo clave de los paquetes modernos es separar el estado de la aplicación del estado del sistema tanto como sea posible, a la vez que se mantiene la compatibilidad con otras aplicaciones.A key goal of a modern package is to separate application state from system state as much as possible while maintaining compatibility with other apps. Para ello, Windows 10 coloca la aplicación dentro de un paquete MSIX y, posteriormente, detecta y redirige algunos cambios que realiza en el sistema de archivos y en el registro en tiempo de ejecución.Windows 10 accomplishes this by placing the application inside a MSIX package, and then detecting and redirecting some changes it makes to the file system and registry at runtime.

Los paquetes que creas para tu aplicación de escritorio son solo de escritorio y las aplicaciones de plena confianza no se virtualizan ni están en un espacio aislado.Packages that you create for your desktop application are desktop-only, full-trust applications and are not virtualized or sandboxed. Esto les permite interactuar con otras aplicaciones de la misma forma que las aplicaciones de escritorio clásicas.This allows them to interact with other apps the same way classic desktop applications do.

InstalaciónInstallation

Los paquetes de aplicaciones se instalan en C:\Archivos de programa\WindowsApps\nombre_paquete, con el archivo ejecutable denominado nombre_aplicación.exe.App packages are installed under C:\Program Files\WindowsApps\package_name, with the executable titled app_name.exe. Cada carpeta de paquete contiene un manifiesto (denominado AppxManifest.xml) que incluye un espacio de nombres XML especial para las aplicaciones empaquetadas.Each package folder contains a manifest (named AppxManifest.xml) that contains a special XML namespace for packaged apps. En ese archivo de manifiesto hay un elemento <EntryPoint> que hace referencia a una aplicación de plena confianza.Inside that manifest file is an <EntryPoint> element, which references the full-trust app. Cuando se inicia la aplicación, no se ejecuta dentro de un contenedor de la aplicación, sino que, en su lugar, se ejecuta como el usuario con normalidad.When that application is launched, it does not run inside an app container, but instead it runs as the user as it normally would.

Después de la implementación, el sistema operativo marca los archivos del paquete como de solo lectura y los bloquea completamente.After deployment, package files are marked read-only and heavily locked down by the operating system. Windows evita que las aplicaciones se inicien en caso de que se manipulen estos archivos.Windows prevents apps from launching if these files are tampered with.

Sistema de archivosFile system

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.The OS supports different levels of file system operations for packaged desktop applications, depending on the folder location.

Operaciones de AppData en Windows 10, versión 1903 y versiones posterioresAppData operations on Windows 10, version 1903 and later

Todos los archivos y carpetas recién creados en la carpeta AppData del usuario (por ejemplo, C:\Users\nombre_usuario\AppData) se escriben en una ubicación privada por usuario y por aplicación, pero se combinan en tiempo de ejecución para aparecer en la ubicación real de AppData.All newly created files and folders in the user's AppData folder (e.g., C:\Users\user_name\AppData) are written to a private per-user, per-app location but merged at runtime to appear in the real AppData location. Esto permite cierto grado de separación de estados para los artefactos que solo usa la propia aplicación y, a su vez, esto permite que el sistema limpie esos archivos cuando se desinstala la aplicación.This allows some degree of state separation for artifacts that are only used by the application itself, and this enables the system to clean up those files when the application is uninstalled. 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.Modifications to existing files under the user's AppData folder is allowed to provide a higher degree of compatibility and interactivity between applications and the OS. Esto reduce el "deterioro" del sistema de archivos porque el sistema operativo es consciente de cada cambio de archivo o directorio realizado por una aplicación.This reduces filesystem “rot” because the OS is aware of every file or directory change made by an application. La separación de estados también permite que las aplicaciones de escritorio empaquetadas reanuden la actividad en la que se quedó la versión no empaquetada de la misma aplicación.State separation also allows packaged desktop applications to pick up where a non-packaged version of the same application left off. Ten en cuenta que el sistema operativo no es compatible con una carpeta del sistema de archivos virtual (VFS) de la carpeta AppData del usuario.Note that the OS does not support a virtual file system (VFS) folder for the user's AppData folder.

Operaciones de AppData en Windows 10, versión 1809 y versiones posterioresAppData operations on Windows 10, version 1809 and earlier

Todo lo que se escribe en la carpeta AppData del usuario (por ejemplo, C:\Usuarios\nombre_usuario\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.All writes to the user's AppData folder (e.g., C:\Users\user_name\AppData), including create, delete, and update, are copied on write to a private per-user, per-app location. Esto crea la ilusión de que la aplicación empaquetada está editando el elemento AppData real, pero, en realidad, está modificando una copia privada.This creates the illusion that the packaged application is editing the real AppData when it is actually modifying a private copy. Al redireccionar las escrituras de este modo, el sistema puede realizar un seguimiento de todas las modificaciones de archivos que realiza la aplicación.By redirecting writes this way, the system can track all file modifications made by the app. 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 para el usuario.This allows the system to clean up those files when the application is uninstalled, thus reducing system "rot" and providing a better application removal experience for the user.

Otras carpetasOther folders

Además de redirigir AppData, las carpetas conocidas de Windows (System32, Archivos de programa (x86), etcétera) se combinan dinámicamente con los directorios correspondientes del paquete de la aplicación.In addition to redirecting AppData, Windows' well-known folders (System32, Program Files (x86), etc) are dynamically merged with corresponding directories in the app package. Cada paquete contiene una carpeta denominada "VFS" en su raíz.Each package contains a folder named "VFS" at its root. Las lecturas de directorios o archivos en el directorio VFS se combinan en tiempo de ejecución con sus respectivos equivalentes nativos.Any reads of directories or files in the VFS directory are merged at runtime with their respective native counterparts. Por ejemplo, una aplicación podría contener C:\Archivos de programa\WindowsApps\nombre_paquete\VFS\SystemX86\vc10.dll como parte de su paquete de aplicación, pero el archivo aparecería como instalado en C:\Windows\System32\vc10.dll.For example, an application could contain C:\Program Files\WindowsApps\package_name\VFS\SystemX86\vc10.dll as part of its app package, but the file would appear to be installed at C:\Windows\System32\vc10.dll. Esto mantiene la compatibilidad con las aplicaciones de escritorio que pudieran esperar que los archivos se encuentren en ubicaciones distintas del paquete.This maintains compatibility with desktop applications that may expect files to live in non-package locations.

No se permiten las escrituras en archivos o carpetas del paquete de la aplicación.Writes to files/folders in the app package are not allowed. El sistema operativo ignora las escrituras en archivos y carpetas que no forman parte del paquete, y se permiten si el usuario tiene permisos.Writes to files and folders that are not part of the package are ignored by the OS and are allowed as long as the user has permission.

Operaciones comunesCommon operations

En la siguiente tabla de referencia breve se muestran las operaciones comunes del sistema de archivos y cómo las controla el sistema operativo.This short reference table shows common file system operations and how the OS handles them.

OperaciónOperation ResultadoResult EjemploExample
Lectura o enumeración de un archivo o una carpeta de Windows conocidosRead or enumerate a well-known Windows file or folder Una combinación dinámica de C:\Archivos de programa\nombre_paquete\VFS\carpeta_conocida con el equivalente del sistema local.A dynamic merge of C:\Program Files\package_name\VFS\well_known_folder with the local system counterpart. La lectura de C:\Windows\System32 devuelve el contenido de C:\Windows\System32, además del contenido de C:\Archivos de programa\WindowsApps\nombre_paquete\VFS\SystemX86.Reading C:\Windows\System32 returns the contents of C:\Windows\System32 plus the contents of C:\Program Files\WindowsApps\package_name\VFS\SystemX86.
Escritura en AppDataWrite under AppData Windows 10, versión 1903 y versiones posteriores: Los nuevos archivos y carpetas creados en los siguientes directorios se redirigen a una ubicación privada por usuario y por paquete:Windows 10, version 1903 and later: New files and folders created under the following directories are redirected to a per-user, per-package private location:
  • LocalLocal
  • Local\MicrosoftLocal\Microsoft
  • MovilidadRoaming
  • Roaming\MicrosoftRoaming\Microsoft
  • Roaming\Microsoft\Windows\Start Menu\ProgramsRoaming\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.In response to a file open command, the OS will open the file from the per-user, per-package location first. Si no existe esta ubicación, el sistema operativo intentará abrir el archivo desde la ubicación real de AppData.If this location doesn't exist, the OS will attempt to open the file from the real AppData location. Si el archivo se abre desde la ubicación real de AppData, no se producirá ninguna virtualización para ese archivo.If the file is opened from the real AppData location, no virtualization for that file occurs. Se permite la eliminación de archivos en AppData si el usuario cuenta con los permisos necesarios.File deletes under AppData are allowed if user has permissions.

Windows 10, versión 1809 y versiones anteriores: Copia en escritura a una ubicación por usuario, por aplicación.Windows 10, version 1809 and earlier: Copy-on-written to a per-user, per-app location.

Normalmente, AppData es C:\Usuarios\nombre_usuario\AppData.AppData is typically C:\Users\user_name\AppData.
Escritura dentro el paqueteWrite inside the package No permitido.Not allowed. El paquete es de solo lectura.The package is read-only. No se permiten las escrituras en C:\Archivos de programa\WindowsApps\nombre_paquete.Writes under C:\Program Files\WindowsApps\package_name are not allowed.
Escrituras fuera del paqueteWrites outside the package Se permiten si el usuario tiene permisos.Allowed if the user has permissions. Una operación de escritura en C:\Windows\System32\foo.dll se permite si el paquete no contiene C:\Archivos de programa\WindowsApps\nombre_paquete\VFS\SystemX86\foo.dll y el usuario tiene permisos.A write to C:\Windows\System32\foo.dll is allowed if the package does not contain C:\Program Files\WindowsApps\package_name\VFS\SystemX86\foo.dll and the user has permissions.

Ubicaciones de VFS empaquetadasPackaged VFS locations

En la tabla siguiente se muestra en qué ubicación del sistema se superponen los archivos que se envían como parte del paquete para la aplicación.The following table shows where files shipping as part of your package are overlaid on the system for the app. 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:\Archivos de programa\WindowsApps\nombre_paquete\VFS.Your application will perceive these files to be in the listed system locations, when in fact they are in the redirected locations inside C:\Program Files\WindowsApps\package_name\VFS. Las ubicaciones de FOLDERID proceden de las constantes KNOWNFOLDERID.The FOLDERID locations are from the KNOWNFOLDERID constants.

Ubicación del sistemaSystem Location Ubicación redirigida (en [RutaDelPaquete]\VFS)Redirected Location (Under [PackageRoot]\VFS) Válido en las arquitecturasValid on architectures
FOLDERID_SystemX86FOLDERID_SystemX86 SystemX86SystemX86 x86, amd64x86, amd64
FOLDERID_SystemFOLDERID_System SystemX64SystemX64 amd64amd64
FOLDERID_ProgramFilesX86FOLDERID_ProgramFilesX86 ProgramFilesX86ProgramFilesX86 x86, amd6x86, amd6
FOLDERID_ProgramFilesX64FOLDERID_ProgramFilesX64 ProgramFilesX64ProgramFilesX64 amd64amd64
FOLDERID_ProgramFilesCommonX86FOLDERID_ProgramFilesCommonX86 ProgramFilesCommonX86ProgramFilesCommonX86 x86, amd64x86, amd64
FOLDERID_ProgramFilesCommonX64FOLDERID_ProgramFilesCommonX64 ProgramFilesCommonX64ProgramFilesCommonX64 amd64amd64
FOLDERID_WindowsFOLDERID_Windows WindowsWindows x86, amd64x86, amd64
FOLDERID_ProgramDataFOLDERID_ProgramData AppData comunesCommon AppData x86, amd64x86, amd64
FOLDERID_System\catrootFOLDERID_System\catroot AppVSystem32CatrootAppVSystem32Catroot x86, amd64x86, amd64
FOLDERID_System\catroot2FOLDERID_System\catroot2 AppVSystem32Catroot2AppVSystem32Catroot2 x86, amd64x86, amd64
FOLDERID_System\drivers\etcFOLDERID_System\drivers\etc AppVSystem32DriversEtcAppVSystem32DriversEtc x86, amd64x86, amd64
FOLDERID_System\driverstoreFOLDERID_System\driverstore AppVSystem32DriverstoreAppVSystem32Driverstore x86, amd64x86, amd64
FOLDERID_System\logfilesFOLDERID_System\logfiles AppVSystem32LogfilesAppVSystem32Logfiles x86, amd64x86, amd64
FOLDERID_System\spoolFOLDERID_System\spool AppVSystem32SpoolAppVSystem32Spool x86, amd64x86, amd64

RegistroRegistry

Los paquetes de aplicaciones contienen un archivo registry.dat, que actúa como el equivalente lógico de HKLM\Software en el registro real.App packages contain a registry.dat file, which serves as the logical equivalent of HKLM\Software in the real registry. En tiempo de ejecución, este Registro virtual combina el contenido de este subárbol en el subárbol del sistema nativo para proporcionar una vista especial de ambos.At runtime, this virtual registry merges the contents of this hive into the native system hive to provide a singular view of both. Por ejemplo, si registry.dat contiene una sola clave "Foo", entonces una operación de lectura de HKLM\Software en tiempo de ejecución también mostrará que contiene "Foo" (además de todas las claves del sistema nativo).For example, if registry.dat contains a single key "Foo", then a read of HKLM\Software at runtime will also appear to contain "Foo" (in addition to all the native system keys).

Solo las claves que se encuentran en HKLM\Software forman parte del paquete, no las claves que se encuentran en HKCU o en otros lugares del Registro.Only keys under HKLM\Software are part of the package; keys under HKCU or other parts of the registry are not. No se permiten las escrituras en las claves o los valores del paquete.Writes to keys or values in the package are not allowed. Las escrituras en las claves o los valores que no forman parte del paquete se permiten si el usuario tiene permisos.Writes to keys or values not part of the package are allowed as long as the user has permission.

Todas las escrituras en HKCU se copian en escritura a una ubicación privada por usuario y por aplicación.All writes under HKCU are copy-on-written to a private per-user, per-app location. Tradicionalmente, los desinstaladores no pueden limpiar HKEY_CURRENT_USER porque los datos del Registro de los usuarios que cerraron sesión se desmontan y no están disponibles.Traditionally, uninstallers are unable to clean HKEY_CURRENT_USER because the registry data for logged out users is unmounted and unavailable.

Todas las escrituras se conservan durante la actualización del paquete y únicamente se eliminan cuando la aplicación se quita por completo.All writes are kept during package upgrade and only deleted when the application is removed entirely.

Operaciones comunesCommon operations

En la siguiente tabla de referencia breve se muestran las operaciones del registro y cómo las controla el sistema operativo.This short reference table shows common registry operations and how the OS handles them.

OperaciónOperation ResultadoResult EjemploExample
Lectura o enumeración de HKLM\SoftwareRead or enumerate HKLM\Software Una combinación dinámica del subárbol del paquete con el equivalente del sistema local.A dynamic merge of the package hive with the local system counterpart. Si registry.dat contiene una sola clave "Foo", en tiempo de ejecución una operación de lectura de HKLM\Software mostrará el contenido de HKLM\Software, además de HKLM\Software\Foo.If registry.dat contains a single key "Foo," at runtime a read of HKLM\Software will show the contents of both HKLM\Software plus HKLM\Software\Foo.
Escrituras en HKCUWrites under HKCU Copia en escritura a una ubicación privada por usuario, por aplicación.Copy-on-written to a per-user, per-app private location. Lo mismo que AppData para archivos.The same as AppData for files.
Escrituras dentro el paquete.Writes inside the package. No permitido.Not allowed. El paquete es de solo lectura.The package is read-only. No se permiten las escrituras en HKLM\Software si existe una clave o un valor correspondiente en el subárbol del paquete.Writes under HKLM\Software are not allowed if a corresponding key/value exist in the package hive.
Escrituras fuera del paqueteWrites outside the package Ignoradas por el sistema operativo.Ignored by the OS. Se permiten si el usuario tiene permisos.Allowed if the user has permissions. Las escrituras en HKLM\Software se permiten si no existe una clave y un valor correspondiente en el subárbol del paquete y si el usuario tiene los permisos de acceso adecuados.Writes under HKLM\Software are allowed as long as a corresponding key/value does not exist in the package hive and the user has the correct access permissions.

DesinstalaciónUninstallation

Cuando el usuario desinstala un paquete, se quitan todos los archivos y las carpetas ubicados en C:\Archivos de programa\WindowsApps\nombre_paquete, así como las escrituras redirigidas a AppData o al registro que se capturaron durante el proceso de empaquetado.When a package is uninstalled by the user, all files and folders located under C:\Program Files\WindowsApps\package_name are removed, as well as any redirected writes to AppData or the registry that were captured during the packaging process.