wix主要升级没有安装所有文件

时间:2013-02-28 15:00:55

标签: wix major-upgrade

我有一个非常简单的WiX项目(版本3.7),它安装了一些文件(.NET程序版本6.0.0.0)。我准备使用WiX中的MajorUpgrade功能发布新版本6.0.1.0。

我在Product元素中保持UpgradeCode相同,我将版本从6.0.0.0更改为6.0.1.0

<Product Id="*" Name="MyApp" Version="6.0.1.0" Manufacturer="Me" 
       UpgradeCode="$(var.TheUpgradeCodeGUID)">

在安装了6.0.0.0的计算机上,我运行新的安装程序。

删除旧版本6.0.0.0运行正常(所有已安装的文件都被删除),但是当安装程序继续安装新版本时,缺少2个文件:第三方DLL和第三方EXE(即没有被改变)没有被重新安装。

<Component Id="AutomaticUpdaterWPF.dll" Guid="*">
        <File Id="AutomaticUpdaterWPF.dll" Source="AutomaticUpdaterWPF.dll" KeyPath="yes" Checksum="yes" />
</Component>
<Component Id="wyUpdaterProgram" Guid="*">
        <File Id="wyUpdaterProgram" Source="wyUpdate.exe" KeyPath="yes" Checksum="yes" />
</Component>

&lt;中的所有其他文件ComponentGroup&gt; (在主要升级过程中正在正确安装一些未修改的,包括其他第三方DLL)。

如果我在主要升级后点击“修复”,则会重新显示2个丢失的文件。 此外,如果我是第一次安装版本6.0.1.0(没有升级,但在干净的机器上首次安装),则直接和正常安装这两个文件。 (在多台Windows机器上测试(XP,7和8)

有人建议有什么问题以及如何解决?

6 个答案:

答案 0 :(得分:27)

提供的日志文件显示机器上已有的几个文件的较新版本:

MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {015A4DC1-56F4-562B-96B5-B3BE0D45FA5F} since the same component with higher versioned keyfile exists
MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {4B6A1404-3892-5BEF-AB47-8FE3149211A4} since the same component with higher versioned keyfile exists

我过去曾见过这个更新程序的这个问题。克里斯托弗是对的。更新程序更新了其文件,但没有告诉MSI(它不会更新MSI,这不是正确的事情)。新的MSI认为更新的东西在机器上,选择不安装它的文件,但在升级期间旧的包删除文件(它没有注意到版本更新)。由于新的安装程序选择不安装文件,因此最终没有...直到修复。

要解决此问题,您需要稍后移动RemoveExistingProducts操作。如果您正在使用MajorUpgrade元素,则Schedule='afterInstallExecute'Schedule='afterInstallFinalize'应该可以使用。您需要更加谨慎使用Component Rules

此外,恕我直言,第三方供应商不应该更新MSI之外的文件。他们的决定是强迫您的产品升级。

答案 1 :(得分:5)

日志文件会有所帮助。我猜这是基于您安排RemoveExistingProducts的位置。我已经看到Costing计算出正在安装的文件与已安装的文件相同并决定不安装该文件的情况。然后主要升级发生,你最终没有该文件。修复工作,因为文件不存在,并且成本计算意识到它需要安装。

答案 2 :(得分:2)

我对这个问题有另一种解决方法,但是上一则回答肯定为我指明了正确的方向。为.NET项目中的DLL分配的版本号比以前的安装版本低。转到AssemblyInfo.cs文件并将第三个八位字节从0递增到1即可解决该问题。 Wix现在认为DLL是更新的。

[assembly: AssemblyVersion("1.0.1.*")]

答案 3 :(得分:1)

我遇到了同样的问题。这里的问题是进行重大升级时,msi首先检查要安装的组件(所有版本低于已安装版本的dll都标记为“不安装”),然后删除已安装的应用程序,然后安装新版本,但没有那些以前标记的组件。

对REP的重新安排没有帮助,因为在Costing阶段完成了“不允许安装(...)”,而MajorUpgrade仅可以在Install阶段进行了安排。

我的解决方案是在wxs文件中将REINSTALLMODE属性设置为“ amus”。

<Property Id="REINSTALLMODE" Value="amus" />

“ a”表示所有dll(无论其版本)都将被重新安装。

答案 4 :(得分:0)

在旧版本的Windows Installer上,此处记录了此问题:

https://support.microsoft.com/en-us/kb/905238

受影响的产品列表显示它已在MSI引擎4.0及更高版本中修复。如果适用于操作系统版本,在执行安装之前使用4.5可再发行组件应该会有所帮助。

答案 5 :(得分:0)

安装程序5.0仍然存在错误,但仍然存在问题。 在RemoveExistingProduct之后放置InstallFinalize的解决方法对我们来说无法解决问题。我强制通过单个文件的属性设置进行更新。

此解决方案现在适用于我们。