パッケージ デスクトップ アプリケーションの内側Behind the scenes of your packaged desktop application

この記事では、デスクトップ アプリケーションの 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 プラットフォーム (UWP) パッケージ内に配置し、実行時にファイル システムとレジストリに行われる変更を検出して、一部の変更のリダイレクトを行います。The bridge accomplishes this by placing the application inside a Universal Windows Platform (UWP) 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\package_name にインストールされ、実行可能プログラム名は app_name.exe になります。App packages are installed under C:\Program Files\WindowsApps\package_name, with the executable titled app_name.exe. 各パッケージ フォルダーには、パッケージ アプリ用の XML 名前空間を含むマニフェスト (AppxManifest.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

アプリの状態を含めるために、アプリケーションによる AppData への変更がキャプチャされます。In order to contain app state, changes that the application makes to AppData are captured. 作成、削除、更新など、ユーザーの AppData フォルダー (例: C:\Users\user_name\AppData) に対する書き込みはすべて、書き込み時にユーザーごと、アプリごとのプライベートな場所にコピーされます。All write 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.

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\package_name\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 bridge and are allowed as long as the user has permission.

一般的な操作Common operations

一般的なファイル システム操作とブリッジでの処理方法を以下に示します。This short reference table shows common file system operations and how the bridge handles them.

操作Operation 結果Result Example
既知の Windows ファイルまたはフォルダーに対する読み取りまたは列挙Read or enumerate a well-known Windows file or folder C:\Program Files\package_name\VFS\well_known_folder がローカル システムの対応部分に動的にマージされます。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\package_name\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.
AppData 内の書き込みWrite under AppData 書き込み時に、ユーザーごと、アプリごとの場所にコピーされます。Copy-on-written to a per-user, per-app location. AppData は通常、C:\Users\user_name\AppData です。AppData is typically C:\Users\user_name\AppData.
パッケージ内の書き込みWrite inside the package 許可されていません。Not allowed. パッケージは読み取り専用です。The package is read-only. C:\Program Files\WindowsApps\package_name 内の書き込みは、許可されていません。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\package_name\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 \windowsapps\package_name\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 リダイレクトされた場所 ([PackageRoot]\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、amd64x86, 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 一般的な 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 bridge handles them.

操作Operation 結果Result Example
HKLM\Software に対する読み取りまたは列挙Read or enumerate HKLM\Software パッケージのハイブがローカル システムの対応部分に動的にマージされます。A dynamic merge of the package hive with the local system counterpart. registry.dat に単一のキー "Foo" が含まれている場合、実行時に HKLM\Software を読み取ると、HKLM\SoftwareHKLM\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.
HKCU 以下の書き込みWrites 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 bridge. ユーザーにアクセス許可があれば、許可されます。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 \windowsapps\package_nameの下にあるすべて削除されます。 パッケージ化プロセス中にキャプチャされた 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.

次のステップNext steps

質問に対する回答を見つけるFind answers to your questions

ご質問がある場合は、Have questions? Stack Overflow でお問い合わせください。Ask us on Stack Overflow. Microsoft のチームでは、これらのタグをチェックしています。Our team monitors these tags. こちらから質問することもできます。You can also ask us here.

フィードバックの提供または機能の提案を行うGive feedback or make feature suggestions

UserVoice のページをご覧ください。See UserVoice.