我有一个非常简单的WiX项目(版本3.7),它安装了一些文件(.NET程序版本6.0.0.0) . 我准备使用WiX中的MajorUpgrade功能发布新版本6.0.1.0 .
我在Product元素中保持UpgradeCode相同,并将Version从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>
在主要升级期间,<ComponentGroup>中的所有其他文件(一些已修改,一些未修改,包括其他第三方DLL)正在正确安装 .
如果我在主要升级后单击“修复”,则会重新显示2个丢失的文件 . 此外,如果我是第一次安装版本6.0.1.0(没有升级,但在干净的机器上首次安装),则直接和正常安装这两个文件 . (在几台Windows机器上测试过(XP,7和8)
任何人有什么建议错误以及如何解决?
5 回答
日志文件会有所帮助 . 我猜这是基于您安排RemoveExistingProducts的位置 . 我已经看到Costing计算出正在安装的文件与已安装的文件相同并决定不安装该文件的情况 . 然后主要升级发生,你最终没有该文件 . 修复工作,因为文件不存在,并且成本计算意识到需要安装它 .
我有另一个解决这个问题的方法,但之前的回复肯定指出了我正确的方向 . 我的.NET项目中的DLL被分配了比我之前的安装更低的版本号 . 转到AssemblyInfo.cs文件并将第三个八位字节从0递增到1解决了它 . Wix现在认识到DLL更新 .
提供的日志文件显示机器上已有的几个文件的较新版本:
我在过去看过这个更新程序的这个问题 . 克里斯托弗是对的 . 更新程序更新了其文件,但没有告诉MSI(它不会更新MSI,这不是正确的事情) . 新的MSI认为更新的东西在机器上,选择不安装它的文件,但在升级期间旧的包删除文件(它没有注意到版本更新) . 由于新安装程序选择不安装文件,因此最终没有任何内容......直到修复 .
要解决此问题,您需要稍后移动RemoveExistingProducts操作 . 如果你正在使用MajorUpgrade元素,那么
Schedule='afterInstallExecute'
或Schedule='afterInstallFinalize'
就可以了 . 你需要对Component Rules更加小心 .此外,恕我直言,第三方供应商不应该更新MSI之外的文件 . 他们的决定是迫使您的产品采用特定的升级方式 .
在旧版本的Windows Installer上,此处记录了以下问题:
https://support.microsoft.com/en-us/kb/905238
受影响的产品列表显示它已在MSI引擎4.0及更高版本中修复 . 如果适用于操作系统版本,在执行安装之前使用4.5可再发行应该会有所帮助 .
安装程序5.0仍然存在错误,但仍然存在问题 . 在
InstallFinalize
之后放置RemoveExistingProduct
的解决方法对我们来说无法解决 . 我强制通过单个文件的属性设置进行更新 .这个解决方案现在适用于我们 .