自定义应用程序体验的能力非常重要,尤其是对于企业而言。 我们已经与 IT 专业人员进行了交谈,我们知道,自定义应用程序以满足其用户的需求对于迁移到 Windows 10 至关重要。 自定义使用 MSI 打包的应用程序时,据了解,IT 专业人员必须从开发人员获取该包,并使用自定义项重新打包安装程序以满足其需求。 对于企业来说,这是一项代价高昂的努力。 今后,我们希望分离自定义项和主应用程序,以便不再需要重新打包。 这可确保企业从开发人员那里获取最新更新,同时仍保持对自定义项的控制。
在 Windows 10 版本 1809 中,我们引入了一种称为 修改包的新型 MSIX 包。 修改包是存储自定义项的 MSIX 包。 修改包也可以是可能没有激活点的插件/加载项。 IT 专业人员可以使用此功能灵活更改 MSIX 容器,以便应用程序由其企业的自定义项覆盖。
工作原理
修改包专为不拥有应用程序代码且只有安装程序的企业设计。 可以使用最新版本的 MSIX 打包工具(适用于 Windows 10 版本 1809 或更高版本)创建修改包。 如果有应用程序的代码,也可以创建 应用扩展。
如果要创建一个对主应用的严格绑定的修改包,可以将主应用声明为修改包清单中的依赖项。
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.15063.0"/>
<uap4:MainPackageDependency Name="Main.App"/>
</Dependencies>
以下示例演示如何指定其他证书或发布者。
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.15063.0"/>
<uap4:MainPackageDependency Name="Main.App" Publisher="CN=Contoso, C=US" />
</Dependencies>
如果修改包与主包之间的关系是一对一,则这是一个简单的配置。 典型的自定义通常需要 HKEY_CURRENT_USER 或 HKEY_CURRENT_USERCLASS 下的注册表项。 在 MSIX 包中,我们有User.dat和Userclass.dat文件来捕获注册表项。 如果需要 HKCU\Software* 下的注册表项,则需要创建 User.dat(就像 Registry.dat 用于 HKLM\Software* 一样)。 如果需要 HKCU\Sofware\Classes*下的密钥,请使用Userclass.dat。
下面是创建.dat文件的典型方法:
使用 Regedit 创建文件。 在 Regedit 中创建 Hive 并插入必要的密钥。 先右键单击,然后导出并另存为 hive 文件。 请确保将文件命名为User.dat或Userclass.dat
使用 API 创建必要的文件。 可以使用 ORSaveHive 函数保存.dat文件。 请确保将文件命名为User.dat或Userclass.dat
进行必要的更改后,可以像创建任何其他 MSIX 包一样创建修改包。 然后,可以使用当前的部署方案来部署包。 重新启动主应用时,可以看到修改包所做的更改。 如果选择删除修改包,则主应用将还原为没有修改包的状态。
了解设备上安装了哪些修改包
使用 PowerShell,可以使用以下命令查看已安装的修改包。
Get-AppPackage -PackageTypeFilter Optional
Windows 10 版本 1809 上的修改包
在 Windows 10 版本 1809 上,修改包可以包括需要在注册表中设置的配置,以便主包按预期运行。 这意味着主应用程序利用注册表查看插件是否存在。 部署主包和修改包时,在运行时,应用程序将同时查看主包和修改包的虚拟注册表(VREG)。
请注意,主包可能使用 VREG 执行以下操作:
- 查看插件文件(DLL)的加载位置。 如果是这种情况,请确保该文件是包的一部分。 通过执行此作,主包能够在运行时访问该文件。
- 查看 VREG 项值的显示位置。 主包可能会检查某个值是否在 VREG 中存在。 手动或使用 工具创建修改包时,请确保该值正确。
Windows 10 版本 1903 及更高版本上的修改包
以下功能已添加到 Windows 10 版本 1903。
清单更新
我们已向 MSIX 修改包的清单添加了对以下元素的支持。
<Properties>
<rescap6:ModificationPackage>true</rescap6:ModificationPackage>
</Properties>
若要确保修改包在版本 1903 或更高版本中正常工作,修改包的清单必须包含此元素。 如果您使用 MSIX 打包工具的 1 月版本打包 MSIX 修改包,这个过程将为您自动完成。 如果在发布之前使用工具转换了包,则可以在工具中编辑现有包以添加新元素。 此外,如果用户安装修改包,则会通知他们包可能会修改主应用程序。
如果使用在版本 1903 之前创建的修改包,则必须编辑包清单,将属性更新 MaxVersionTested
为 10.0.18362.0。
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17701.0" MaxVersionTested="10.0.18362.0" />
使用 MSIX 打包工具创建修改包
可以使用 MSIX 打包工具创建修改包:
指定主包。 请务必在要转换的计算机上提供主包的 MSIX 版本。 如果不是这样的话,我们将要求你手动提供发布者和主要应用程序信息。 此外,某些自定义要求在计算机上安装主应用程序。
一旦完成转换后,使用包编辑器修改包。 在某些情况下,主包可能要求您的修改包的 VREG 包含某些特定的值。 在此情况下,需要相应地编辑该包。
使用 MakeAppx.exe 创建修改包
可以使用 Windows 10 SDK 中包含的 MakeAppX.exe 工具手动创建修改包。
在清单文件中,指定主包。 包括发布服务器和主包名称。
<Dependencies> <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17701.0" MaxVersionTested="12.0.0.0"/> <uap4:MainPackageDependency Name="HeadTrax" Publisher="CN=Contoso Software, O=Contoso Corporation, C=US" /> </Dependencies>
创建Registry.dat、User.dat和Userclass.dat以创建加载修改包所需的任何注册表项。 仅当需要主应用程序查看自定义注册表项时,才需要这样做。 请记住,由于所有内容在容器中运行,在运行时,主包和修改包虚拟注册表将合并,以便主包可以查看修改包虚拟注册表。
只要主应用程序的可执行文件不在虚拟文件系统(VFS)中,此过程也支持文件系统插件和自定义。 这是为了确保主包可以获得主包和修改包的所有 VFS。
在计算机上安装修改包
在计算机上安装修改包遵循其他安装约定。 值得注意的是,在安装包时,可能需要使用 -OptionalPackagePath 参数。
冲突解决
如果多个修改包尝试更改相同的值,则通过考虑修改包名称的 字母顺序 来解决冲突。