我已经安装了1.1版本。我创建了1.2版本的升级。在这两个产品中,我有两个文件:
<Component Win64="yes" Id="cmpFILE1" Guid="*">
<File Id="filFILE1" KeyPath="yes" Source="$(var.BasePathCMP)Performance.dll" />
</Component>
<Component Win64="yes" Id="cmpFILE2" Guid="*">
<File Id="filFILE2" KeyPath="yes" Source="$(var.BasePathCMP)LockLib.dll" />
</Component>
在升级过程中,LockLib.dll被移除并且没有被替换。在1.2的干净安装中,它是存在的。什么会导致这种行为?
我认为您更改了在msi,旧的和升级中的文件的组件指南。当RemoveExistingProducts接近安装结束时,升级的行为就像合并一样,必要时覆盖文件,并增加共享组件指南的引用计数。最后,REP将删除旧产品并减少组件指南的引用计数。如果该指南没有更多的客户端,它将被删除。如果一个"共享"文件的guid改变了,它将没有更多的客户端并被删除。最后关于REP的事情是,您必须遵循组件共享规则,但如果在升级开始时对REP进行排序,则不必遵循。
我添加了一个示例以供将来参考。
假设第一次安装有3个文件A、B、C和3个向导,分别是1、2和3。你的升级有相同的三个文件,但指针是1、2和8。当REP结束时,升级首先在旧产品上安装。向导1和向导2的refcount从1增加到2。Guid 3保持在1。然后卸载旧的产品。Guids 1和2被重新计数为1,它们仍然在使用中,所以附加到组件Guids的文件保留。Guid 3下降到零,没有引用计数,所以组件被删除,但它附加到文件C,所以C被删除,即使你刚刚安装它。
发生这种情况的原因之一是,在安装包执行升级之后,正在执行RemoveExistingProducts操作。在这种情况下,MSI检测到该文件与以前的版本相同,然后删除它。你可以:
- RemoveExistingProducts变更顺序
- 设置DLL为Shared
我推荐选项一。
RemoveExistingProducts元素