Informazioni sull'esecuzione in Windows di app desktop in pacchetto
Questo argomento descrive i tipi di app desktop per cui è possibile creare un pacchetto di app di Windows, insieme ad alcuni comportamenti del sistema operativo (OS) e altre specifiche, che sono importanti da tenere presenti. Verranno fornite informazioni dettagliate sugli elementi seguenti (come si vedrà, il comportamento specifico dipende dal tipo di app):
- Percorso di installazione e directory di lavoro dell'app (che potrebbe essere diverso da quello assunto in passato dall'app).
- Il file system del sistema operativo e il comportamento del Registro di sistema.
- Disinstallazione.
Tipi di app desktop
Esistono due tipi di app desktop che è possibile creare e creare un pacchetto. Dichiari il tipo dell'app nel manifesto del pacchetto dell'app usando l'attributo uap10:RuntimeBehavior dell'elemento Application :
- Un tipo include sia le app WinUI 3 (che usano la SDK per app di Windows) che le app Desktop Bridge (Centennial). Dichiarato con
uap10:RuntimeBehavior="packagedClassicApp"
. - L'altro tipo rappresenta altri tipi di app Win32, incluse le app in pacchetto con posizione esterna. Dichiarato con
uap10:RuntimeBehavior="win32App"
.
anche le app piattaforma UWP (Universal Windows Platform) (uap10:RuntimeBehavior="windowsApp"
UWP) sono incluse nel pacchetto, ma questo argomento non è relativo.
E quindi l'attributo uap10:TrustLevel (dello stesso elemento Application ) determina se il processo dell'app in pacchetto viene eseguito all'interno di un contenitore di app.
- Un'app di attendibilità completa. Dichiarato con
uap10:TrustLevel="mediumIL"
. - AppContainer. Dichiarato con
uap10:TrustLevel="appContainer"
. Viene eseguito in un contenitore di app leggero (ed è quindi isolato usando il file system e la virtualizzazione del Registro di sistema). Per altre info, vedi App MSIXAppContainer.
Importante
Per altri dettagli, dipendenze e requisiti di funzionalità, vedere la documentazione relativa a questi due attributi in Application. Vedi anche uap10 è stato introdotto in Windows 10 versione 2004 (10.0; Build 19041).
Scopo della creazione di pacchetti e dei contenitori di app
Lo scopo della creazione del pacchetto dell'app è concedere l'identità del pacchetto in fase di esecuzione. L'identità del pacchetto è necessaria per determinate funzionalità di Windows (vedere Funzionalità che richiedono l'identità del pacchetto). È possibile creare un pacchetto di tutte le combinazioni di tipi di app descritte in precedenza (e quindi trarre vantaggio dall'identità del pacchetto).
Ma l'obiettivo principale di un'app AppContainer è separare lo stato dell'app dallo stato del sistema il più possibile, mantenendo al contempo la compatibilità con altre app. Windows esegue questa operazione rilevando e reindirizzando determinate modifiche apportate al file system e al Registro di sistema in fase di esecuzione (nota come virtualizzazione). Verrà chiamato quando una sezione si applica solo alle app virtualizzate.
Installazione
I pacchetti dell'app vengono installati in base all'utente anziché a livello di sistema. Il percorso predefinito per i nuovi pacchetti in un nuovo computer è in C:\Program Files\WindowsApps\<package_full_name>
, con l'eseguibile denominato app_name.exe. Ma i pacchetti possono essere installati in altre posizioni; Ad esempio, i comandi Start di Visual Studio usano .$(OutDir)
Dopo la distribuzione, i file del pacchetto sono contrassegnati come di sola lettura e sono fortemente bloccati dal sistema operativo. Windows impedisce l'avvio delle app se tali file vengono manomessi.
Il C:\Program Files\WindowsApps
percorso è noto come PackageVolume. Tale posizione è l'oggetto PackageVolume predefinito fornito da Windows; ma è possibile creare un PackageVolume in qualsiasi unità e in qualsiasi percorso. Inoltre, non tutti i pacchetti vengono installati in packageVolume (vedere l'esempio di Visual Studio precedente).
File system
Il sistema operativo supporta diversi livelli di operazioni del file system per le app desktop in pacchetto, a seconda del percorso della cartella.
Ottimizzato per il dispositivo
Per evitare la duplicazione dei file (per ottimizzare lo spazio di archiviazione su disco e ridurre la larghezza di banda necessaria durante il download dei file), il sistema operativo sfrutta l'archiviazione singola e il collegamento rigido dei file. Quando un utente scarica un pacchetto MSIX, AppxManifest.xml
viene usato per determinare se i dati contenuti nel pacchetto esistono già su disco da un'installazione precedente del pacchetto. Se lo stesso file esiste in più pacchetti MSIX, il sistema operativo archivia il file condiviso su disco una sola volta e crea collegamenti rigidi da entrambi i pacchetti al file condiviso. Poiché i file vengono scaricati in blocchi di 64 KB, anche se esiste una percentuale di un file scaricato su disco, viene scaricato solo l'incremento diverso. Ciò riduce la larghezza di banda usata per il download.
Operazioni relative ad AppData in Windows 10, versione 1903 e successive
Questa sezione si applica solo alle app virtualizzate.
Tutti i file e le cartelle appena creati nella cartella dell'utente (ad esempio , C:\Users\<user_name>\AppData
) vengono scritti in un percorso privato per utente, per app, ma unito in fase di AppData
esecuzione per essere visualizzato nella posizione realeAppData
. Ciò consente un certo grado di separazione dello stato per gli artefatti usati solo dall'app stessa; che consente al sistema di pulire tali file quando l'app viene disinstallata.
Le modifiche apportate ai file esistenti nella cartella dell'utente AppData
sono consentite per offrire un livello più elevato di compatibilità e interattività tra le app e il sistema operativo. Ciò riduce il sistema "rot" perché il sistema operativo è a conoscenza di ogni modifica di file o directory apportata da un'app. La separazione dello stato consente anche alle app desktop in pacchetto di selezionare la posizione in cui è stata interrotta una versione non in pacchetto della stessa app. Si noti che il sistema operativo non supporta una cartella VFS (Virtual File System) per la cartella dell'utente AppData
.
Operazioni di AppData su sistemi operativi precedenti a Windows 10, versione 1903
Questa sezione si applica solo alle app virtualizzate.
Tutte le scritture nella cartella dell'utente AppData
( ad esempio C:\Users\<user_name>\AppData
) , incluse le operazioni di creazione, eliminazione e aggiornamento, vengono copiate in scrittura in un percorso privato per utente, per app. Ciò crea l'illusione che l'app in pacchetto stia modificando il reale AppData
quando sta effettivamente modificando una copia privata. Reindirizzando le scritture in questo modo, il sistema può tenere traccia di tutte le modifiche apportate ai file dall'app. Ciò consente al sistema di pulire tali file quando l'app viene disinstallata, riducendo così il sistema "rot" e offrendo un'esperienza migliore di rimozione delle app per l'utente.
Directory di lavoro e file dell'applicazione
Questa sezione si applica solo alle app virtualizzate.
Oltre a reindirizzare AppData
, le cartelle note di Windows (System32
, e Program Files (x86)
così via) vengono unite dinamicamente con le directory corrispondenti nel pacchetto dell'app. Ogni pacchetto contiene una cartella denominata VFS
nella radice. Tutte le letture di directory o file nella VFS
directory vengono unite in fase di esecuzione con le rispettive controparti native. Ad esempio, un'app può contenere C:\Program Files\WindowsApps\<package_full_name>\VFS\SystemX86\vc10.dll
come parte del pacchetto dell'app, ma il file sembra essere installato in C:\Windows\System32\vc10.dll
. Ciò mantiene la compatibilità con le app desktop che prevedono che i file si trovano in posizioni non di pacchetto.
Le scritture in file/cartelle nel pacchetto dell'app non sono consentite. Le scritture in file e cartelle che non fanno parte del pacchetto vengono ignorate dal sistema operativo e sono consentite purché l'utente disponga dell'autorizzazione.
Operazioni comuni del file system
Questa breve tabella di riferimento mostra le operazioni comuni sul file system e il modo in cui vengono gestite dal sistema operativo.
Operazione | Result | Esempio |
---|---|---|
Leggere o enumerare un file o una cartella windows nota | Unione dinamica di C:\Program Files\<package_full_name>\VFS\<well_known_folder> con la controparte di sistema locale. |
La lettura C:\Windows\System32 restituisce il contenuto di C:\Windows\System32 più il contenuto di C:\Program Files\WindowsApps\<package_full_name>\VFS\SystemX86 . |
Scrivi in AppData |
Windows 10, versione 1903 e successive: i nuovi file e cartelle creati nelle directory seguenti vengono reindirizzati a un percorso privato per utente e per pacchetto:
AppData . Se il file viene aperto dal percorso reale AppData , non viene eseguita alcuna virtualizzazione per tale file. Le eliminazioni di file in AppData sono consentite se l'utente dispone delle autorizzazioni.Versioni precedenti a Windows 10, versione 1903: copia in scrittura in un percorso per utente, per app. |
AppData è in C:\Users\<user_name>\AppData genere . |
Scrivere all'interno del pacchetto | Non consentiti. Il pacchetto è di sola lettura. | Le scritture in C:\Program Files\WindowsApps\<package_full_name> non sono consentite. |
Scrivere all'esterno del pacchetto | Consentito se l'utente dispone delle autorizzazioni. | È consentito scrivere in C:\Windows\System32\foo.dll se il pacchetto non contiene C:\Program Files\WindowsApps\<package_full_name>\VFS\SystemX86\foo.dll e l'utente dispone delle autorizzazioni. |
Percorsi VFS in pacchetto
Questa sezione si applica solo alle app virtualizzate.
Questa tabella mostra dove i file spediti come parte del pacchetto sono sovrapposti nel sistema per l'app. L'app percepisce questi file in modo che si trovano nelle posizioni di sistema elencate quando in realtà si trovano nei percorsi reindirizzati all'interno C:\Program Files\WindowsApps\<package_full_name>\VFS
di . I percorsi FOLDERID provengono dalle costanti KNOWNFOLDERID.
Posizione del sistema | Percorso reindirizzato (in [<package_root>]\VFS) | Valido per le architetture |
---|---|---|
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 | Comune AppData |
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
Questa sezione (e le relative sezioni secondarie) si applica solo alle app virtualizzate.
I pacchetti dell'app contengono un registry.dat
file, che funge da equivalente logico (virtuale) di HKLM\Software nel registro reale. In fase di esecuzione, il Registro di sistema virtuale unisce il contenuto di tale hive nell'hive di sistema nativo per fornire una singola visualizzazione di entrambi. Ad esempio, se registry.dat
contiene una singola chiave Foo, verrà visualizzata anche una lettura di HKLM\Software in fase di esecuzione che conterrà Foo (oltre a tutte le chiavi di sistema native).
Anche se i pacchetti MSIX includono chiavi HKLM e HKCU , vengono trattati in modo diverso. Solo le chiavi in HKLM\Software fanno parte del pacchetto. Le chiavi in HKCU o altre parti del Registro di sistema non sono. Le scritture in chiavi o valori nel pacchetto non sono consentite. Le scritture in chiavi o valori che non fanno parte del pacchetto sono consentite a condizione che l'utente disponga delle autorizzazioni.
Tutte le scritture in HKCU vengono copiate in scrittura in un percorso privato per utente, per app. Tradizionalmente, i disinstallatori non sono in grado di pulire HKEY_CURRENT_Uedizione Standard R perché i dati del Registro di sistema per gli utenti disconnessi sono smontati e non disponibili.
Tutte le scritture vengono mantenute durante l'aggiornamento del pacchetto ed eliminate solo quando l'app viene rimossa completamente.
Operazioni comuni del Registro di sistema
La maggior parte di questa sezione si applica solo alle app virtualizzate.
Questa breve tabella di riferimento mostra le operazioni comuni sul Registro di sistema e indica come vengono gestite dal sistema operativo.
Operazione | Result | Esempio |
---|---|---|
Leggere o enumerare HKLM\Software | Unione dinamica dell'hive del pacchetto con la controparte del sistema locale. | Se registry.dat contiene una singola chiave Foo, in fase di esecuzione una lettura di HKLM\Software mostra il contenuto di HKLM\Software e HKLM\Software\Foo. |
Scritture in HKCU | Copiato in scrittura in una posizione privata per utente e per app. | Uguale AppData a per i file. |
Scrive all'interno del pacchetto. | Non consentiti. Il pacchetto è di sola lettura. | Le scritture in HKLM\Software non sono consentite se esiste una chiave/valore corrispondente nell'hive del pacchetto. |
Scrive all'esterno del pacchetto | Ignorate dal sistema operativo. Consentito se l'utente dispone delle autorizzazioni. | Le scritture in HKLM\Software sono consentite purché non esista una chiave/valore corrispondente nell'hive del pacchetto e che l'utente disponga delle autorizzazioni di accesso corrette. |
Disinstallazione
Questa sezione si applica solo alle app virtualizzate.
Quando un pacchetto viene disinstallato dall'utente, tutti i file e le cartelle presenti C:\Program Files\WindowsApps\<package_full_name>
in vengono rimossi, nonché eventuali scritture reindirizzate in AppData
o nel Registro di sistema acquisito durante il processo di creazione del pacchetto.