Windows でパッケージ化されたデスクトップ アプリが動作するしくみについて

操作 結果
既知の Windows ファイルまたはフォルダーに対する読み取りまたは列挙 C:\Program Files\package_name\VFS\well_known_folder がローカル システムの対応部分に動的にマージされます。 C:\Windows\System32 の読み取りでは、C:\Windows\System32 の内容と C:\Program Files\WindowsApps\package_name\VFS\SystemX86 の内容が返されます。
AppData 内の書き込み Windows 10 バージョン 1903 以降: 次のディレクトリの下に作成された新しいファイルとフォルダーは、ユーザーごと、パッケージごとのプライベートな場所にリダイレクトされます。
  • ローカル
  • Local\Microsoft
  • ローミング
  • Roaming\Microsoft
  • Roaming\Microsoft\Windows\Start Menu\Programs
ファイルを開くコマンドに応答して、OS によってユーザーごと、パッケージごとの場所から最初にファイルが開かれます。 この場所が存在しない場合、OS では実際の AppData の場所からファイルを開こうと試みられます。 ファイルが実際の AppData の場所から開かれた場合、そのファイルの仮想化は実行されません。 ユーザーにアクセス許可がある場合は、AppData の下でのファイルの削除が許可されます。

Windows 10 バージョン 1809 以前: 書き込み時に、ユーザーごと、アプリごとの場所にコピーされます。

AppData は通常、C:\Users\user_name\AppData です。
パッケージ内の書き込み 許可されていません。 パッケージは読み取り専用です。 C:\Program Files\WindowsApps\package_name 内の書き込みは、許可されていません。
パッケージ外の書き込み ユーザーにアクセス許可があれば、許可されます。 C:\Windows\System32\foo.dll への書き込みは、パッケージに C:\Program Files\WindowsApps\package_name\VFS\SystemX86\foo.dll が含まれておらずユーザーにアクセス許可があれば許可されます。

パッケージ化された VFS の場所

次の表は、パッケージの一部として含まれるファイルが、システム上でアプリのためにどのように配置されるかを示しています。 これらのファイルは、アプリケーションではここに示されているシステム内の場所にあると認識されますが、実際にはリダイレクトされており、C:\Program Files\WindowsApps\package_name\VFS 内の場所に配置されます。 FOLDERID の場所は KNOWNFOLDERID 定数で示されます。

システムの場所 リダイレクトされた場所 ([PackageRoot]\VFS の下) 有効なアーキテクチャ
FOLDERID_SystemX86 SystemX86 x86、amd64
FOLDERID_System SystemX64 amd64
FOLDERID_ProgramFilesX86 ProgramFilesX86 x86、amd64
FOLDERID_ProgramFilesX64 ProgramFilesX64 amd64
FOLDERID_ProgramFilesCommonX86 ProgramFilesCommonX86 x86、amd64
FOLDERID_ProgramFilesCommonX64 ProgramFilesCommonX64 amd64
FOLDERID_Windows Windows x86、amd64
FOLDERID_ProgramData 一般的な 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

レジストリ

アプリ パッケージには、registry.dat ファイルが含まれています。このファイルは、実際のレジストリ内の HKLM\Software に論理的に対応しています。 実行時には、この仮想レジストリのハイブの内容がネイティブ システム ハイブにマージされ、両方が一括して表示されます。 たとえば、registry.dat に単一のキー "Foo" が含まれている場合、実行時に HKLM\Software を読み取ると、(すべてのネイティブ システム キーに加えて) "Foo" も含まれているように表示されます。

MSIX パッケージには HKLM および HKCU キーが含まれていますが、それぞれ異なって扱われます。 パッケージに含まれる部分は HKLM\Software 以下のキーのみです。HKCU 以下のキーやレジストリの他の部分は、パッケージに含まれていません。 パッケージ内のキーまたは値への書き込みは許可されていません。 パッケージに含まれないキーまたは値への書き込みは、ユーザーにそのアクセス許可があれば許可されます。

HKCU 以下の書き込みはすべて、書き込み時にユーザーごと、アプリごとのプライベートな場所にコピーされます。 従来、ログアウトしたユーザーのレジストリ データはマウント解除され使用できなくなるため、アンインストーラーが HKEY_CURRENT_USER をクリーンアップできませんでした。

書き込みはすべて、パッケージのアップグレード中には保持され、アプリケーションが完全に削除された場合にのみ削除されます。

一般的な操作

一般的なレジストリ操作と OS での処理方法を以下の表に示します。

操作 結果
HKLM\Software に対する読み取りまたは列挙 パッケージのハイブがローカル システムの対応部分に動的にマージされます。 registry.dat に単一のキー "Foo" が含まれている場合、実行時に HKLM\Software を読み取ると、HKLM\SoftwareHKLM\Software\Foo の内容がどちらも表示されます。
HKCU 以下の書き込み 書き込み時に、ユーザーごと、アプリごとのプライベートな場所にコピーされます。 ファイルの AppData と同じです。
パッケージ内の書き込み 許可されていません。 パッケージは読み取り専用です。 対応するキー/値がパッケージ ハイブに存在する場合、HKLM\Software 以下の書き込みは許可されません。
パッケージ外の書き込み OS では無視されます。 ユーザーにアクセス許可があれば、許可されます。 HKLM\Software 以下の書き込みは、対応するキー/値がパッケージに含まれておらずユーザーに適切なアクセス許可があれば許可されます。

アンインストール

パッケージがユーザーによってアンインストールされると、C:\Program Files\WindowsApps\package_name の下にあるすべてのファイルとフォルダーが削除されます。また、パッケージ化処理中にキャプチャされた、AppData またはレジストリに対するリダイレクトされた書き込みも削除されます。

この記事では、デスクトップ アプリケーション用の Windows アプリ パッケージを作成するときに、ファイルとレジストリ エントリに対して何が行われるかについて詳しく説明します。

最新のパッケージの主な目的は、他のアプリとの互換性を維持しつつ、アプリケーションの状態をシステムの状態からできるだけ分離することです。 Windows 10 ではこれを行うために、アプリケーションが MSIX パッケージ内に配置され、実行時にファイル システムとレジストリに対して行われる変更が検出されて、一部の変更がリダイレクトされます。

デスクトップ アプリケーション用に作成するパッケージは、デスクトップ専用の完全信頼アプリケーションであり、仮想化もサンドボックス化もされません。 このため、従来のデスクトップ アプリケーションと同じように、他のアプリとやり取りすることが可能です。

インストール

アプリ パッケージは C:\Program Files\WindowsApps\package_name にインストールされ、実行可能プログラム名は app_name.exe になります。 各パッケージ フォルダーには、パッケージ アプリ用の XML 名前空間を含むマニフェスト (AppxManifest.xml という名前) が含まれています。 マニフェスト ファイル内の <EntryPoint> 要素で、完全信頼アプリを参照します。 そのアプリケーションは、起動されたときに、アプリ コンテナーの内部では実行されず、ユーザーが通常実行するように実行されます。

展開後、パッケージ ファイルは読み取り専用としてマークされ、オペレーティング システムによって厳重にロックダウンされます。 これらのファイルが改ざんされると、Windows によりアプリの起動が回避されます。

ファイル システム

OS では、フォルダーの場所に応じて、パッケージ化されたデスクトップ アプリケーションに対してさまざまなレベルのファイル システム操作がサポートされています。

デバイスに応じた最適化

ファイルの重複を避けてディスク記憶領域を最適化し、ファイルをダウンロードするときに必要な帯域幅を削減するために、OS では、単一の記憶域とファイルのハード リンクが利用されます。 ユーザーが MSIX パッケージをダウンロードするときに、AppxManifest.xml を使用して、パッケージに含まれているデータが以前のパッケージのインストールによってディスク上に既に存在するかどうかが確認されます。 同じファイルが複数の MSIX パッケージ内に存在する場合は、OS によって共有ファイルがディスク上に 1 回だけ保存され、両方のパッケージから共有ファイルへのハード リンクが作成されます。 ファイルは 64K のブロックでダウンロードされるため、ダウンロードされるファイルの一部分がディスク上に存在する場合でも、異なる増分のみがダウンロードされます。 これにより、ダウンロードに使用される帯域幅が削減されます。

Windows 10 バージョン 1903 以降の AppData 操作

ユーザーの AppData フォルダー (例: C:\Users\user_name\AppData) に新しく作成されたすべてのファイルとフォルダーは、ユーザーごと、アプリごとのプライベートな場所に書き込まれますが、実際の AppData の場所に表示されるように、実行時にマージされます。 これにより、アプリケーション自体によってのみ使用される成果物に対して、ある程度の状態の分離が可能になり、アプリケーションのアンインストール時に、システムでそれらのファイルをクリーンアップできるようになります。 ユーザーの AppData フォルダーにある既存のファイルに変更を加えることによって、アプリケーションと OS の間でより高いレベルの互換性と対話機能を提供できるようになります。 これにより、アプリケーションによって行われるすべてのファイルまたはディレクトリの変更が OS に認識されるため、ファイル システムの "劣化" が抑えられます。 また、状態を分離することで、パッケージ化したデスクトップ アプリケーションでは、同じアプリケーションのパッケージ化されていないバージョンが停止した場所から開始することもできます。 仮想ファイル システム (VFS) フォルダーは、ユーザーの AppData フォルダーとして OS でサポートされていないことにご注意ください。

Windows 10 バージョン 1809 以前での AppData 操作

作成、削除、更新など、ユーザーの AppData フォルダー (例: C:\Users\user_name\AppData) に対する書き込みはすべて、書き込み時にユーザーごと、アプリごとのプライベートな場所にコピーされます。 つまり、パッケージ化したアプリケーションで実際の AppData への編集を行っているように見えても、実際に行われているのはプライベート コピーへの変更です。 このように書き込みのリダイレクトを行うことで、アプリによって行われたすべてのファイル変更をシステムで追跡できます。 これにより、アプリケーションのアンインストール時にシステムがそれらのファイルをクリーンアップできるため、システムの "劣化" を抑え、ユーザーから見たアプリケーション削除の操作を改善することができます。

その他のフォルダー

AppData のリダイレクトに加えて、Windows の既知のフォルダー (System32、Program Files (x86) など) がアプリ パッケージ内の対応するディレクトリに動的にマージされます。 それぞれのパッケージのルート ディレクトリには、"VFS" という名前のフォルダーが含まれています。 この VFS ディレクトリ内のディレクトリまたはファイルに対する読み取り操作は、実行時にそれぞれ対応するネイティブ部分にマージされます。 たとえば、アプリケーション パッケージに C:\Program Files\WindowsApps\package_name\VFS\SystemX86\vc10.dll が含まれている場合、このファイルは C:\Windows\System32\vc10.dll にインストールされているように表示されます。 これにより、ファイルがパッケージ外の場所にあることを想定しているデスクトップ アプリケーションとの互換性が維持されます。

アプリ パッケージ内のファイルまたはフォルダーへの書き込みは、許可されていません。 パッケージに含まれないファイルやフォルダーへの書き込みは、OS では無視され、ユーザーにアクセス許可があれば許可されます。

一般的な操作

一般的なファイル システム操作と OS での処理方法を以下の表に示します。