Основные сведения о работе упакованных классических приложений в WindowsUnderstanding how packaged desktop apps run on Windows

Эта статья содержит более подробные сведения о том, что происходит с файлами и записями реестра при создании пакета приложения Windows для классического приложения.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.

Главная задача современного пакета — максимально отделить состояние приложения от состояния системы, в то же время не нарушая совместимость с другими приложениями.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 помещает приложение в пакет MSIX, а затем определяет и перенаправляет некоторые изменения, вносимые приложением в файловую систему и реестр во время выполнения.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.

Пакеты, создаваемые вами для классических приложений, представляют собой пригодные для запуска только на компьютере приложения с полным доверием, не виртуализированные и не изолированные.Packages that you create for your desktop application are desktop-only, full-trust applications and are not virtualized or sandboxed. Это позволяет им взаимодействовать с другими приложениями точно так же, как это делают классические приложения.This allows them to interact with other apps the same way classic desktop applications do.

УстановкаInstallation

Пакеты приложения устанавливаются в папку C:\Program Files\WindowsApps\имя_пакета; исполняемый файл имеет имя вида имя_приложение.exe.App packages are installed under C:\Program Files\WindowsApps\package_name, with the executable titled app_name.exe. Каждая папка пакета содержит манифест (с именем AppxManifest.xml), содержащий специальное пространство имен XML для упакованных приложений.Each package folder contains a manifest (named AppxManifest.xml) that contains a special XML namespace for packaged apps. Внутри этого файла манифеста находится элемент <EntryPoint>, который указывает на приложение с полным доверием.Inside that manifest file is an <EntryPoint> element, which references the full-trust app. При запуске этого приложения оно выполняется не в контейнере приложения, а как обычно, т. е. как пользователь.When that application is launched, it does not run inside an app container, but instead it runs as the user as it normally would.

После развертывания пакета файлы помечаются как доступные только для чтения и блокируются операционной системой.After deployment, package files are marked read-only and heavily locked down by the operating system. Windows не позволяет запускать приложения, если в эти файлы внесены несанкционированные изменения.Windows prevents apps from launching if these files are tampered with.

Файловая системаFile system

ОС поддерживает различные уровни операций с файловой системой для упакованных классических приложений в зависимости от расположения папок.The OS supports different levels of file system operations for packaged desktop applications, depending on the folder location.

Операции AppData в Windows 10 версии 1903 и более поздних версийAppData operations on Windows 10, version 1903 and later

Все недавно созданные файлы и папки в папке AppData пользователя (например, C:\Users\user_name\AppData) записываются в частном расположении для каждого пользователя, но во время выполнения они появляются в папке 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. Это позволяет в некоторой степени разделять состояния для артефактов, которые используются только самим приложением, и дает возможность системе очищать эти файлы при удалении приложения.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. Изменения в существующих файлах в пользовательской папке AppData позволяют обеспечить более высокую степень совместимости и взаимодействия между приложениями и операционной системой.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. Это уменьшает "деградацию" файловой системы, потому что операционной системе будет известно о каждом файле или изменении каталога, сделанном приложением.This reduces filesystem “rot” because the OS is aware of every file or directory change made by an application. Разделение состояний также позволяет упакованным классическим приложениям получать информацию о том, где осталась неупакованная версия того же самого приложения.State separation also allows packaged desktop applications to pick up where a non-packaged version of the same application left off. Обратите внимание, что операционная система не поддерживает папку виртуальной файловой системы (VFS) для пользовательской папки AppData.Note that the OS does not support a virtual file system (VFS) folder for the user's AppData folder.

Операции AppData в Windows 10 версии 1809 и более поздних версийAppData operations on Windows 10, version 1809 and earlier

Все операции записи в папку AppData пользователя (например, C:\Users\имя_пользователя\AppData), включая создание, удаление и обновление, при записи копируются в закрытое расположение, отдельное для каждого пользователя и каждого приложения.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. При этом создается иллюзия того, что упакованное приложение редактирует настоящую папку AppData, хотя на самом деле изменения вносятся в закрытую копию.This creates the illusion that the packaged application is editing the real AppData when it is actually modifying a private copy. Перенаправляя операции записи таким образом, система может отслеживать все изменения, вносимые приложением в файлы.By redirecting writes this way, the system can track all file modifications made by the app. Это позволяет системе очистить эти файлы при удалении приложения, тем самым уменьшая "деградацию" системы и делая процедуру удаления приложения более комфортной для пользователя.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.

Другие папкиOther folders

Кроме перенаправления AppData, для известных папок Windows (System32, Program Files (x86), и т. д.) выполняется динамическое объединение с соответствующими каталогами в пакете приложения.In addition to redirecting AppData, Windows' well-known folders (System32, Program Files (x86), etc) are dynamically merged with corresponding directories in the app package. В корне каждого пакета содержится папка с именем "VFS".Each package contains a folder named "VFS" at its root. Все операции чтения каталогов или файлов в каталоге VFS во время выполнения объединяются с их системными эквивалентами.Any reads of directories or files in the VFS directory are merged at runtime with their respective native counterparts. Например, приложение может содержать файл C:\Program Files\WindowsApps\имя_пакета\VFS\SystemX86\vc10.dll в составе пакета приложения, но будет казаться, что этот файл установлен в папку 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. Это обеспечивает совместимость с классическими приложениями, которые могут ожидать, что файлы будут находиться не в пакете.This maintains compatibility with desktop applications that may expect files to live in non-package locations.

Операции записи в файлы и папки в пакете приложения не допускаются.Writes to files/folders in the app package are not allowed. Операции записи в файлы и папки, которые не входят в пакет, игнорируются и допускаются ОС при условии, что у пользователя есть на них разрешение.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.

Типичные операцииCommon operations

В этой краткой справочной таблице приведены типичные операции с файловой системой с указанием того, как они обрабатываются ОС.This short reference table shows common file system operations and how the OS handles them.

ОперацияOperation РезультатResult ПримерExample
Чтение или перечисление известного файла или папки WindowsRead or enumerate a well-known Windows file or folder Динамическое объединение C:\Program Files\имя_пакета\VFS\известная_папка с локальным системным эквивалентом.A dynamic merge of C:\Program Files\package_name\VFS\well_known_folder with the local system counterpart. Операция чтения C:\Windows\System32 возвращает содержимое C:\Windows\System32 плюс содержимое C:\Program Files\WindowsApps\имя_пакета\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.
Запись в папке AppDataWrite under AppData Windows 10 версии 1903 и более поздних версий. Новые файлы и папки, созданные в следующих каталогах, перенаправляются в частное расположение для каждого пользователя и пакета: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:
  • ЛокальнаяLocal
  • Local\MicrosoftLocal\Microsoft
  • РоумингRoaming
  • Roaming\MicrosoftRoaming\Microsoft
  • Roaming\Microsoft\Windows\Start Menu\ProgramsRoaming\Microsoft\Windows\Start Menu\Programs
В ответ на команду открытия файла ОС сначала открывает файл из расположения для каждого пользователя и пакета.In response to a file open command, the OS will open the file from the per-user, per-package location first. Если это расположение не существует, ОС попытается открыть файл из настоящей папки AppData.If this location doesn't exist, the OS will attempt to open the file from the real AppData location. Если файл открыт из настоящего расположения AppData, виртуализация для этого файла не выполняется.If the file is opened from the real AppData location, no virtualization for that file occurs. Удаление файлов в AppData разрешено при наличии у пользователя на это прав.File deletes under AppData are allowed if user has permissions.

Windows 10 версии 1809 и более ранних версий. Копирование при записи в расположение, отдельное для каждого пользователя и каждого приложения.Windows 10, version 1809 and earlier: Copy-on-written to a per-user, per-app location.

Папка AppData — это обычно C:\Users\имя_пользователя\AppData.AppData is typically C:\Users\user_name\AppData.
Запись внутри пакетаWrite inside the package Не допускается.Not allowed. Пакет доступен только для чтения.The package is read-only. Операции записи внутри папки C:\Program Files\WindowsApps\имя_пакета не допускаются.Writes under C:\Program Files\WindowsApps\package_name are not allowed.
Запись за пределами пакетаWrites outside the package Допускается, если у пользователя есть разрешения.Allowed if the user has permissions. Операция записи в C:\Windows\System32\foo.dll допускается, если пакет не содержит файла C:\Program Files\WindowsApps\имя_пакета\VFS\SystemX86\foo.dll и у пользователя есть разрешения.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.

Расположения, соответствующие расположениям в каталоге VFS пакетаPackaged VFS locations

В следующей таблице показано, где в системе для приложения создаются оверлеи файлов, поставляемых в составе пакета.The following table shows where files shipping as part of your package are overlaid on the system for the app. Приложение будет считать, что эти файлы находятся в указанных системных расположениях, но на самом деле они будут находиться в перенаправленных расположениях внутри каталога C:\Program Files\WindowsApps\имя_пакета\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. Расположения FOLDERID происходят от констант KNOWNFOLDERID.The FOLDERID locations are from the KNOWNFOLDERID constants.

Системное расположениеSystem Location Перенаправленное расположение (в [Корневой каталог пакета]\VFS)Redirected Location (Under [PackageRoot]\VFS) Действительно для следующих архитектурValid 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 Common AppDataCommon 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

РеестрRegistry

Пакеты приложений содержат файл registry.dat, который выступает в качестве логического эквивалента куста HKLM\Software в реальном реестре.App packages contain a registry.dat file, which serves as the logical equivalent of HKLM\Software in the real registry. Во время выполнения этот виртуальный реестр объединяет содержимое этого куста с собственным кустом системы, чтобы обеспечить их единообразное представление.At runtime, this virtual registry merges the contents of this hive into the native system hive to provide a singular view of both. Например, если registry.dat содержит только раздел «Foo», при чтении куста HKLM\Software во время выполнения создастся впечатление, что этот куст также содержит раздел «Foo» (в дополнение ко всем собственным разделам системы).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).

В состав пакета входят только разделы внутри куста HKLM\Software; разделы внутри куста HKCU или другие составляющие реестра к пакету не относятся.Only keys under HKLM\Software are part of the package; keys under HKCU or other parts of the registry are not. Операции записи в разделы или значения в пакете не допускаются.Writes to keys or values in the package are not allowed. Операции записи в разделы или значения, которые не входят в пакет, допускаются, если у пользователя есть на них разрешение.Writes to keys or values not part of the package are allowed as long as the user has permission.

Все операции записи внутри куста HKCU копируются при записи в расположение, отдельное для каждого пользователя и каждого приложения.All writes under HKCU are copy-on-written to a private per-user, per-app location. Как правило, при удалении приложения не удается очистить раздел HKEY_CURRENT_USER, потому что данные реестра для вышедших из системы пользователей размонтированы и недоступны.Traditionally, uninstallers are unable to clean HKEY_CURRENT_USER because the registry data for logged out users is unmounted and unavailable.

Результаты всех операций записи сохраняются при обновлении пакета и удаляются только при полном удалении приложения.All writes are kept during package upgrade and only deleted when the application is removed entirely.

Типичные операцииCommon operations

В этой краткой справочной таблице приведены типичные операции с реестром с указанием того, как они обрабатываются ОС.This short reference table shows common registry operations and how the OS handles them.

ОперацияOperation РезультатResult ПримерExample
Чтение или перечисление куста HKLM\SoftwareRead or enumerate HKLM\Software Динамическое объединение куста пакета с локальным системным эквивалентом.A dynamic merge of the package hive with the local system counterpart. Например, если registry.dat содержит только раздел «Foo», операция чтения куста HKLM\Software во время выполнения возвратит содержимое и HKLM\Software, и 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.
Запись внутри куста HKCUWrites under HKCU Копирование при записи в закрытое расположение, отдельное для каждого пользователя и каждого приложения.Copy-on-written to a per-user, per-app private location. (Аналогично AppData для файлов.)The same as AppData for files.
Запись внутри пакетаWrites inside the package. Не допускается.Not allowed. Пакет доступен только для чтения.The package is read-only. Операции записи внутри куста HKLM\Software не допускаются, если в кусте пакета существует соответствующая пара «раздел-значение».Writes under HKLM\Software are not allowed if a corresponding key/value exist in the package hive.
Запись за пределами пакетаWrites outside the package Игнорируется ОС.Ignored by the OS. Допускается, если у пользователя есть разрешения.Allowed if the user has permissions. Операции записи внутри куста HKLM\Software допускаются при условии, что в кусте пакета нет соответствующей пары «раздел-значение», и что у пользователя есть соответствующие разрешения на доступ.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.

УдалениеUninstallation

При удалении пакета пользователем все файлы и папки, расположенные в папке C:\Program Files\WindowsApps\имя_пакета, удаляются вместе с результатами всех перенаправленных операций записи в папку AppData или реестр, записанных в процессе упаковки.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.