旧版本的安装程序是使用InstallScope="PerMachine">创建的。 新版本旨在具有InstallScope="PerUser">;它还需要使用与旧版本创建的相同的注册表项。
问题是,在升级过程中存储在这些注册表项下的任何值都将在最后被旧版本存储的初始值覆盖。即使在安装之前手动删除这些键,也会使它们在安装过程后重新出现(使用错误的值)。
我尝试创建自定义操作并专门删除这些键,但结果是相同的。
如何确保旧版本不会干扰新版本的安装过程,从而允许删除旧注册表项并重新创建它们?
我发现正在起作用:
安装新版本后立即执行修复将产生正确的结果!
在安装新版本之前手动卸载旧版本不会删除密钥,但允许使用正确的值覆盖它们。
您应该定义您正在执行的升级类型,如果它是主要升级,那么它在您的主要升级元素中的顺序在哪里,尽管......
可能主要问题是Windows安装程序不支持跨上下文主要升级,因此,如果您正在进行主要升级,则最终将同时安装这两种产品。这不是升级,很可能只是碰撞。因此,假设您只希望在所有这些结束时安装其中一个,则需要卸载较旧的每计算机安装,然后安装每用户。至于为什么卸载每台计算机的产品不会删除注册表项,有许多可能的原因,例如它们是由应用程序而不是 MSI 创建的,或者组件被标记为永久,或者组件在系统上有另一个客户端产品 - 卸载日志可能会显示正在发生的事情。
我必须将其添加为答案,太长了。一旦您提供更多信息,我将"发展"它:
-
为什么要切换到每用户安装?在 MSI 世界中,这不是理想的部署方式。即使按计算机安装,应用程序也可供每个用户使用。使用每台计算机安装,您只需添加写入不应被用户覆盖的共享设置的功能。您的应用程序总体上更易于升级、卸载、修补和管理。
-
下面是一些链接,用于解释每用户设置的一些问题。它们是真实的,我只是想警告人们他们最有可能面临的问题(几乎肯定会面临):
- WIX升级出现问题
- 了解应用程序安装包的"每用户"或"每计算机"上下文
-
您是在部署 HKCU 还是 HKLM 密钥?我不建议从您的设置中写入任何 HKCU 值,它们应该由应用程序本身编写。设置用于写入 HKLM 和其他需要"提升权限"的地方。它永远不应该用于编写用户首选项。当您进行升级时,会有干扰(正如您所经历的那样)。
- 您所说的注册表数据存储在哪里?在单个或多个 MSI 组件中?该组件中是否还有其他内容需要在没有注册表项的情况下安装?如果可以,请添加您的源WiX文件,以便我们确定。
我相信,如果您严格遵循我们的建议,我们可以消除所有这些问题。您正面临一个非常常见的 MSI 问题。
让我在没有所有信息的情况下尝试一个试探性的答案:
- 从设置中删除所有 HKCU 注册表信息(如果可以)。
- 更新应用程序以自行写入这些 HKCU 值,理想情况下写入注册表中的全新位置而不是旧位置。例如,
HKCUSoftwareMyCompanyMyApp5
而不是HKCUSoftwareMyCompanyMyApp
。这"解耦"了你的新旧状态,你有空间来操纵和清理事情。 - 让您的应用程序写入 HKCU 密钥不是黑客,而是正确的做法。它将使您的应用程序更加健壮,并且通常更容易为您自己和您的团队进行QA。您可以在测试期间"擦拭干净",无需重新安装即可重新开始 - 以便专注于应用程序测试。
- 将任何剩余的 HKLM 设置放在单个 WiX 组件中,并设置一个永远不会被用户或任何其他进程修改或删除的良好密钥路径。例如:
HKLMSoftwareMyCompanyMyApp5MyAppHKLMKeyPath = 1
- 如果您发现必须覆盖每个用户的值(换句话说,在HKCU中为每个用户更改某些内容),则可以使用此方法执行此操作,该方法将设置与应用程序本身的功能相结合:http://forum.installsite.net/index.php?showtopic=21552(如果这很重要,请阅读整个链接线程)。