概述
灵活的虚拟化功能为应用提供了一种方法,用于声明其 一组 文件和注册表项应该对其他应用可见;这些应用应在应用卸载时保留。 所有其他 文件和注册表项对其他应用 不 可见;并在卸载时删除。
如何控制所选位置的虚拟化
注释
本部分介绍的行为是在 Windows 10 版本 21H1 中引入的。
从 Windows 10 版本 21H1 开始,系统保留非虚拟化资源受限功能的现有行为,以及RegistryWriteVirtualization和FilesystemWriteVirtualization属性。 此外,系统还添加了应用声明要取消虚拟化的特定文件夹和/或注册表项的功能。
- 你只能声明
%USERPROFILE%\AppData
内部的文件系统位置。 - 您只能声明注册表位置在 HKCU 中的。
下面是一个示例。
<!-- Declare the desktop6 and/or virtualization XML namespace where the virtualization properties are defined, and include this in the list of ignorable namespaces. -->
<!-- Declare the XML namespace for the required restricted capability, and include it in the list of ignorable namespaces. -->
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
xmlns:virtualization="http://schemas.microsoft.com/appx/manifest/virtualization/windows10"
IgnorableNamespaces="rescap desktop6 virtualization">
<!-- ... -->
<!-- Other entries omitted for brevity. -->
<!-- ... -->
<Properties>
<!-- If you don't want virtualization of registry writes to HKEY_CURRENT_USER, then include the property, and set it to disabled. -->
<desktop6:RegistryWriteVirtualization>disabled</desktop6:RegistryWriteVirtualization>
<!-- If you don't want virtualization of file system writes to the user's AppData folder, then include the property, and set it to disabled. -->
<desktop6:FileSystemWriteVirtualization>disabled</desktop6:FileSystemWriteVirtualization>
<!-- On Windows 10, version 21H1 and later OS versions, you can declare specific file system and/or registry locations that you want to be unvirtualized.
If these are recognized on the current device, then they take precedence over the old declarations. On older devices,
the new declarations are ignored and the old ones are honored. -->
<virtualization:FileSystemWriteVirtualization>
<virtualization:ExcludedDirectories>
<virtualization:ExcludedDirectory>$(KnownFolder:LocalAppData)\Fabrikam\Widgets</virtualization:ExcludedDirectory>
<virtualization:ExcludedDirectory>$(KnownFolder:RoamingAppData)\Fabrikam\Widgets</virtualization:ExcludedDirectory>
</virtualization:ExcludedDirectories>
</virtualization:FileSystemWriteVirtualization>
<virtualization:RegistryWriteVirtualization>
<virtualization:ExcludedKeys>
<virtualization:ExcludedKey>HKEY_CURRENT_USER\Software\Fabrikam\Widgets</virtualization:ExcludedKey>
</virtualization:ExcludedKeys>
</virtualization:RegistryWriteVirtualization>
</Properties>
<Capabilities>
<!-- Include the required restricted capability. -->
<rescap:Capability Name="unvirtualizedResources"/>
</Capabilities>
</Package>
注释
如果你的应用程序同时声明了旧的 Windows 10 版本 21H1 之前的语法和新的 Windows 10 版本 21H1 语法,则旧声明将在 Windows 10 版本 21H1 之前的版本上使用,而新声明将在 Windows 10 版本 21H1 及更高版本上使用。
Windows 10 版本 21H1 之前的机制
在传统环境中,应用可以在文件系统中的大多数位置创建、更新和删除文件。 他们可以在 Windows 注册表中创建、更新和删除条目。 这些文件和注册表项对系统上的其他应用可见,即使它们通常不需要。 此外,卸载应用时,这些文件和注册表项通常会留下,并变得混乱。
在通用 Windows 平台(UWP)中,此类文件和注册表项会虚拟化,以便只有写入它们的应用才能看到它们。 卸载应用时会将其删除。 但在某些情况下,应用希望此类文件和注册表项对其他应用可见。 此外,其他应用可能要求这些文件和条目在卸载写入它们的应用后仍保留。
默认 MSIX 行为
位置 | 上下文 | DESCRIPTION |
---|---|---|
HKCU | 安装时间 |
|
HKCU | 运行时间 |
|
HKLM | 安装时间 |
|
HKLM | 运行时间 |
|
已知文件夹 | 安装时间 |
|
AppData | 运行时间 |
|
unvirtualizedResources
受限功能
注释
Windows 10 版本 1903(10.0; 编译版本 18362)中引入了 unvirtualizedResources
限制性功能的支持,也称为 Windows 10 2019 年五月更新。
应用可以声明 unvirtualizedResources
受限功能,并将 RegistryWriteVirtualization 和/或 FilesystemWriteVirtualization 属性设置为 true
,以获取 对 HKCU 和/或 AppData 的写入访问权限。 这是为了支持以下情况:应用需要编写随后对包外部的其他进程可见的条目。 例如,游戏会将数据写入 AppData,并且即使在卸载游戏后,该数据也需要保留。
资产 | DESCRIPTION |
---|---|
RegistryWriteVirtualization=disabled | 写入 HKCU 会转到未虚拟化的位置,对包外的其他进程可见,并且不会在应用卸载时清除。 |
FilesystemWriteVirtualization=已禁用 | 写入AppData的数据会被存储到未虚拟化的位置,这些数据对包外部的其他进程可见,并且应用卸载时不会被清除。 |
此机制完全关闭 HKCU 和/或 AppData 虚拟化,这违背了主要目标。 它不是一个细致的工具,通常会超出某特定应用的需求。