WiX:有没有办法判断哪个文件在重大升级中没有被覆盖?



我在Wix中有一个很大的程序,该程序使用了一堆MSIS,C#自定义操作程序,UIS,Bootstrapper,您将其命名,它在那里。

我有一个问题:当我进行重大升级时,以前的版本不会被删除。也就是说,如果我从1.0.0.x版本升级到1.1.0.x, programs&功能显示两个版本都安装在机器上。

这是一个常见的问题,这里有许多解决方案。他们都没有为我工作 - 如果有这样的帖子,我已经尝试过。

我被告知,主要升级中的组件之间存在一对一的关系。也就是说,对于要删除的每个组件,都必须添加另一个组件。当不是一对一的关系时,旧版本没有被删除时 - 因为仍然有旧的组件悬挂。

有没有办法确定哪些组件正在悬挂?像,在日志文件中或其他内容中?如果我能确定MSI有问题的问题,我可以更加主动地解决该问题。


编辑:

尽管我没有解决问题,但由于乌尔曼先生的建议,我可能会在正确的道路上。

我创建了该注册表密钥,但是...似乎什么也没做。但是,我确实搜索了我的卸载日志中的"禁止"一词,我发现了这句话9次:

Disallowing uninstallation of component: {GUID-HERE} since another client exists.

另外,此短语出现在" disallobaly"短语的每个分组之前:

PROPERTY CHANGE: Adding INSTALLLEVEL property.  It's value is '1'.

这给了我一些事情。但是,我似乎找不到提到的指导!它们不在我的解决方案中,在注册表中无法搜索。除了搜索注册表外,还有一种方法(Windows 7 32位)找出特定的GUID对应于什么组件?

我被告知,主要升级中的组件之间存在一对一的关系。也就是说,对于要删除的每个组件,都必须添加另一个组件。当不是一对一的关系时,旧版本没有被删除时 - 因为仍然有旧的组件悬挂。

这不是严格的。 minor 升级是非常正确的,并且在某些配置(涉及较晚删除升级的产品的配置)中,主要升级同样挑剔。但是,您典型的主要升级功能更像用户选择卸载旧版本,然后安装新版本。首先验证您的假设:确保您进行了适当的重大升级(您更改了产品代码和产品代码,并在升级表中有正确的条目,对吗?)。然后诊断。

如何最好地确定发生了什么?以我的经验,日志文件是您最好的选择。由于旧版本是间接卸载的,因此您不能使用命令行来记录它。因此,通过创建或设置以下注册表值来设置记录策略。(稍后在要恢复设置时删除。)

HKEY_LOCAL_MACHINE SOFTWORD PALICIES MICROSOFT WINDOWS Windows Installer
值(reg_sz):记录
数据:Voice Warmup

然后运行您的主要升级,找到在%temp%中生成的适当日志文件。(考虑提前清理%temp%以使其更容易。或按日期进行排序。)尤其是查看卸载(您可以通过Productersion识别或升级ProductuctCode识别)。我会特别寻找诸如不允许组件的卸载的行... 包含组件GUID。

拥有该GUID后,您必须弄清楚它是什么组件,以及如何进入当前状态。您可以手动检查构建的.msi文件(带有Orca之类的工具)来查找组件,但是很少有工具可以告诉您所有客户端。我的雇主的产品配备了一个名为InstallShield MSI侦探的辅助工具,该工具可以列出所有引用组件代码的已安装产品,或者您可以从msienumproducts或installer.com.ponentclients中构建自己的产品。您不能直接搜索注册表,因为Windows Installer以压缩或包装的表单存储GUID。

然后识别"为什么"可能是困难的部分。或者它可能像不正确的共享DLL参考计数一样简单,尤其是如果您仅在看到您的产品的未发布版本的测试机上遇到了这一点。

作为相关的替代方案,但仅与次要升级或小型更新有关,您可以设置EnforceUpgradeComponentRules策略。这有助于揭示您击中问题时的问题,而不是让Windows安装程序尽一切努力继续进行。

相关内容

  • 没有找到相关文章

最新更新