Informazioni sull'esecuzione in Windows di app desktop in pacchettoUnderstanding how packaged desktop apps run on Windows

Questo articolo presenta un'analisi approfondita di ciò che accade ai file e alle voci del Registro di sistema quando crei un pacchetto di app di Windows per la tua applicazione desktop.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.

Uno degli obiettivi principali di un pacchetto moderno è quello di separare il più possibile lo stato dell'applicazione dallo stato del sistema, mantenendo al tempo stesso la compatibilità con altre app.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. Windows 10 ottiene questo risultato inserendo l'applicazione in un pacchetto MSIX e quindi rilevando e reindirizzando alcune modifiche apportate dall'applicazione al file system e al Registro di sistema in fase di esecuzione.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.

I pacchetti creati per la tua applicazione desktop sono applicazioni solo desktop con attendibilità totale e non sono virtualizzati o configurati in un ambiente sandbox.Packages that you create for your desktop application are desktop-only, full-trust applications and are not virtualized or sandboxed. In questo modo, possono interagire con altre app in modo analogo alle applicazioni desktop classiche.This allows them to interact with other apps the same way classic desktop applications do.

InstallazioneInstallation

I pacchetti delle app vengono installati in C:\Programmi\WindowsApps\nome_pacchetto e il nome del file eseguibile è nome_app.exe.App packages are installed under C:\Program Files\WindowsApps\package_name, with the executable titled app_name.exe. Ogni cartella di pacchetto contiene un manifesto (denominato AppxManifest.xml) che include uno spazio dei nomi XML speciale per le app in pacchetto.Each package folder contains a manifest (named AppxManifest.xml) that contains a special XML namespace for packaged apps. All'interno di tale file manifesto c'è un elemento <EntryPoint> che fa riferimento all'app con attendibilità totale.Inside that manifest file is an <EntryPoint> element, which references the full-trust app. All'avvio, tale applicazione non viene eseguita all'interno di un contenitore di app, ma nel contesto dell'utente, come avviene normalmente.When that application is launched, it does not run inside an app container, but instead it runs as the user as it normally would.

Dopo la distribuzione, i file di pacchetto vengono contrassegnati come di sola lettura e bloccati dal sistema operativo.After deployment, package files are marked read-only and heavily locked down by the operating system. Se questi file vengono manomessi, Windows impedisce l'avvio delle app.Windows prevents apps from launching if these files are tampered with.

File systemFile system

Il sistema operativo supporta diversi livelli di operazioni di file system per le applicazioni desktop in pacchetto, a seconda del percorso della cartella.The OS supports different levels of file system operations for packaged desktop applications, depending on the folder location.

Operazioni relative ad AppData in Windows 10, versione 1903 e successiveAppData operations on Windows 10, version 1903 and later

Tutti i nuovi file e cartelle creati nella cartella AppData dell'utente, ad esempio C:\Utenti\nome_utente\AppData, vengono scritti in un percorso privato, per singolo utente e singola app, ma vengono uniti in fase di esecuzione in modo da apparire nel percorso di AppData reale.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. Questo consente un certo grado di separazione dello stato per gli artefatti che vengono usati solo dall'applicazione stessa. In questo modo, il sistema può pulire tali file quando l'applicazione viene disinstallata.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. Le modifiche ai file esistenti nella cartella AppData dell'utente sono consentite per offrire un maggior livello di compatibilità e interattività tra le applicazioni e il 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. Ciò permette di ridurre il deterioramento del file system perché il sistema operativo è a conoscenza di ogni modifica di file o directory effettuata da un'applicazione.This reduces filesystem “rot” because the OS is aware of every file or directory change made by an application. La separazione dello stato consente inoltre alle applicazioni desktop in pacchetto di riprendere l'esecuzione nel punto in cui è stata interrotta una versione non in pacchetto della stessa applicazione.State separation also allows packaged desktop applications to pick up where a non-packaged version of the same application left off. Tieni presente che il sistema operativo non supporta una cartella di file system virtuale (VFS) per la cartella AppData dell'utente.Note that the OS does not support a virtual file system (VFS) folder for the user's AppData folder.

Operazioni relative ad AppData in Windows 10, versione 1809 e successiveAppData operations on Windows 10, version 1809 and earlier

Per tutte le scritture nella cartella AppData dell'utente (ad esempio C:\Utenti\nome_utente\AppData), tra cui creazione, eliminazione e aggiornamento, viene eseguita una copia su scrittura in un percorso privato, per singolo utente e singola app.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. In questo modo si ha l'illusione che l'applicazione in pacchetto stia modificando la cartella AppData reale, mentre invece viene modificata una copia privata.This creates the illusion that the packaged application is editing the real AppData when it is actually modifying a private copy. Reindirizzando in questo modo le scritture, il sistema può tenere traccia di tutte le modifiche ai file effettuate dall'app.By redirecting writes this way, the system can track all file modifications made by the app. Ciò consente al sistema di eseguire la pulizia di questi file quando l'applicazione viene disinstallata, riducendo così il deterioramento del sistema e offrendo all'utente una migliore esperienza di rimozione delle applicazioni.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.

Altre cartelleOther folders

Oltre al reindirizzamento di AppData, viene eseguita l'unione dinamica delle cartelle più note di Windows (System32, Programmi (x86) e così via) con le directory corrispondenti nel pacchetto dell'app.In addition to redirecting AppData, Windows' well-known folders (System32, Program Files (x86), etc) are dynamically merged with corresponding directories in the app package. Nella radice di ogni pacchetto è inclusa una cartella denominata "VFS".Each package contains a folder named "VFS" at its root. Le letture delle directory o dei file nella directory VFS vengono unite in fase di esecuzione con le rispettive controparti native.Any reads of directories or files in the VFS directory are merged at runtime with their respective native counterparts. Un'applicazione potrebbe ad esempio contenere C:\Programmi\WindowsApps\nome_pacchetto\VFS\SystemX86\vc10.dll come parte del pacchetto dell'app, ma il file sembrerebbe installato in 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. Questo consente di mantenere la compatibilità con le applicazioni desktop che potrebbero aspettarsi che i file si trovino in percorsi esterni al pacchetto.This maintains compatibility with desktop applications that may expect files to live in non-package locations.

Le scritture su file e cartelle nel pacchetto dell'app non sono consentite.Writes to files/folders in the app package are not allowed. Le scritture su file e cartelle che non fanno parte del pacchetto vengono ignorate dal sistema operativo e sono consentite a condizione che l'utente disponga delle autorizzazioni.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.

Operazioni comuniCommon operations

Questa breve tabella di riferimento mostra le operazioni comuni sul file system e il modo in cui vengono gestite dal sistema operativo.This short reference table shows common file system operations and how the OS handles them.

OperazioneOperation RisultatoResult EsempioExample
Lettura o enumerazione di una cartella o un file noto di WindowsRead or enumerate a well-known Windows file or folder Unione dinamica di C:\Programmi\nome_pacchetto\VFS\cartella_nota con l'equivalente di sistema locale.A dynamic merge of C:\Program Files\package_name\VFS\well_known_folder with the local system counterpart. La lettura di C:\Windows\System32 restituisce i contenuti di C:\Windows\System32 più i contenuti di C:\Programmi\WindowsApps\nome_pacchetto\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.
Scrittura in AppDataWrite under AppData Windows 10, versione 1903 e successive: i nuovi file e cartelle creati nelle directory seguenti vengono reindirizzati in un percorso privato, per singolo utente e singolo pacchetto: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:
  • LocaleLocal
  • Local\MicrosoftLocal\Microsoft
  • RoamingRoaming
  • Roaming\MicrosoftRoaming\Microsoft
  • Roaming\Microsoft\Windows\Start Menu\ProgramsRoaming\Microsoft\Windows\Start Menu\Programs
In risposta a un comando di apertura file, il sistema operativo aprirà prima il file dal percorso, per singolo utente e singolo pacchetto.In response to a file open command, the OS will open the file from the per-user, per-package location first. Se questo percorso non esiste, il sistema operativo tenterà di aprire il file dal percorso AppData reale.If this location doesn't exist, the OS will attempt to open the file from the real AppData location. Se il file viene aperto dal percorso AppData reale, non viene eseguita alcuna virtualizzazione per tale file.If the file is opened from the real AppData location, no virtualization for that file occurs. Le eliminazioni di file in AppData sono consentite se l'utente dispone delle autorizzazioni.File deletes under AppData are allowed if user has permissions.

Windows 10, versione 1809 e precedenti: Copia su scrittura in un percorso per ogni singolo utente e ogni singola app.Windows 10, version 1809 and earlier: Copy-on-written to a per-user, per-app location.

AppData si trova in genere in C:\Utenti\nome_utente\AppData.AppData is typically C:\Users\user_name\AppData.
Scrittura all'interno del pacchettoWrite inside the package Operazione non consentita.Not allowed. Il pacchetto è di sola lettura.The package is read-only. Le scritture in C:\Programmi\WindowsApps\nome_pacchetto non sono consentite.Writes under C:\Program Files\WindowsApps\package_name are not allowed.
Scritture all'esterno del pacchettoWrites outside the package Consentite se l'utente dispone delle autorizzazioni.Allowed if the user has permissions. Un'operazione di scrittura in C:\Windows\System32\foo.dll è consentita se il pacchetto non contiene C:\Programmi\WindowsApps\nome_pacchetto\VFS\SystemX86\foo.dll e l'utente ha le autorizzazioni.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.

Percorsi dei pacchetti VSFPackaged VFS locations

La tabella seguente illustra i percorsi in cui i file inclusi nel pacchetto vengono sovrapposti nel sistema per l'app.The following table shows where files shipping as part of your package are overlaid on the system for the app. L'applicazione avrà la percezione che i file si trovino nei percorsi di sistema indicati, mentre in realtà si trovano nei percorsi reindirizzati in C:\Programmi\WindowsApps\nome_pacchetto\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. I percorsi FOLDERID derivano da costanti KNOWNFOLDERID.The FOLDERID locations are from the KNOWNFOLDERID constants.

Percorso di sistemaSystem Location Percorso reindirizzato (in [PackageRoot]\VFS\)Redirected Location (Under [PackageRoot]\VFS) Architetture interessateValid 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 Dati applicazioni comuniCommon 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

Registro di sistemaRegistry

I pacchetti delle app contengono un file registry.dat che funge da equivalente logico di HKLM\Software nel Registro di sistema reale.App packages contain a registry.dat file, which serves as the logical equivalent of HKLM\Software in the real registry. In fase di esecuzione, questo Registro di sistema virtuale unisce il contenuto di questo hive con l'hive di sistema nativo per fornire una vista singola di entrambi.At runtime, this virtual registry merges the contents of this hive into the native system hive to provide a singular view of both. Se, ad esempio, registry.dat contiene una singola chiave "Foo", un'operazione di lettura di HKLM\Software in fase di esecuzione conterrà anch'essa "Foo" (oltre a tutte le chiavi di sistema native).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 le chiavi in HKLM\Software fanno parte del pacchetto, mentre quelle in HKCU o in altre parti del Registro di sistema no.Only keys under HKLM\Software are part of the package; keys under HKCU or other parts of the registry are not. Le scritture in chiavi o valori del pacchetto non sono consentite.Writes to keys or values in the package are not allowed. Le scritture in chiavi o valori che non fanno parte del pacchetto sono consentite a condizione che l'utente disponga delle autorizzazioni.Writes to keys or values not part of the package are allowed as long as the user has permission.

Per tutte le scritture in HKCU, viene eseguita una copia su scrittura in un percorso privato per ogni singolo utente e ogni singola app.All writes under HKCU are copy-on-written to a private per-user, per-app location. In genere, i programmi di disinstallazione non sono in grado di pulire HKEY_CURRENT_USER perché i dati del Registro di sistema per gli utenti disconnessi sono smontati e non sono disponibili.Traditionally, uninstallers are unable to clean HKEY_CURRENT_USER because the registry data for logged out users is unmounted and unavailable.

Tutte le scritture vengono conservate durante l'aggiornamento del pacchetto ed eliminate solo quando l'applicazione viene completamente rimossa.All writes are kept during package upgrade and only deleted when the application is removed entirely.

Operazioni comuniCommon operations

Questa breve tabella di riferimento mostra le operazioni comuni sul Registro di sistema e indica come vengono gestite dal sistema operativo.This short reference table shows common registry operations and how the OS handles them.

OperazioneOperation RisultatoResult EsempioExample
Lettura o enumerazione di HKLM\SoftwareRead or enumerate HKLM\Software Unione dinamica dell'hive del pacchetto con l'equivalente di sistema locale.A dynamic merge of the package hive with the local system counterpart. Se registry.dat contiene una singola chiave "Foo", un'operazione di lettura di HKLM\Software mostrerà i contenuti sia di HKLM\Software che di 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.
Scritture in HKCUWrites under HKCU Copia su scrittura in un percorso privato per ogni singolo utente e ogni singola app.Copy-on-written to a per-user, per-app private location. Analogo ad AppData per i file.The same as AppData for files.
Scritture all'interno del pacchetto.Writes inside the package. Operazione non consentita.Not allowed. Il pacchetto è di sola lettura.The package is read-only. Le scritture in HKLM\Software non sono consentite se c'è una coppia chiave/valore corrispondente nell'hive del pacchetto.Writes under HKLM\Software are not allowed if a corresponding key/value exist in the package hive.
Scritture all'esterno del pacchettoWrites outside the package Ignorate dal sistema operativo.Ignored by the OS. Consentite se l'utente dispone delle autorizzazioni.Allowed if the user has permissions. Le scritture in HKLM\Software sono consentite a condizione che non ci sia una coppia chiave/valore corrispondente nell'hive del pacchetto e che l'utente abbia le autorizzazioni di accesso appropriate.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.

DisinstallazioneUninstallation

Quando un pacchetto viene disinstallato dall'utente, tutti i file e le cartelle in C:\Programmi\WindowsApps\nome_pacchetto vengono rimossi, come pure tutte le scritture reindirizzate ad AppData o al Registro di sistema che sono state acquisite durante il processo di creazione del pacchetto.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.