34

我有一个非常简单的 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 个文件:第 3 方 DLL 和第 3 方 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 > 中的所有其他文件(一些已修改,一些未修改,包括其他第 3 方 DLL)在主要升级期间正确安装。

如果我在重大升级后单击“修复”,则丢失的 2 个文件会重新出现。另外,如果我是第一次安装 6.0.1.0 版本(不升级,而是在干净的机器上首次安装),那么这两个文件是直接正常安装的。(在多台 Windows 机器上测试(XP、7 和 8)

有人建议什么是错的以及如何解决它?

4

6 回答 6

30

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

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

此外,恕我直言,第 3 方供应商不应更新 MSI 之外的文件。他们的决定是迫使您的产品采用特定的升级方式。

于 2013-02-28T15:52:54.153 回答
5

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

于 2013-02-28T15:10:28.723 回答
5

我曾经也有过一样的问题。这里的问题是在进行重大升级时,msi 首先检查要安装哪些组件(并且所有版本低于已安装的 dll 都标记为“不安装”),然后它删除已安装的应用程序,然后安装新版本但是没有那些先前标记的组件。

重新安排 REP 并没有帮助,因为“不允许安装 (...)”是在成本核算阶段完成的,而 MajorUpgrade 只能安排在安装阶段。

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

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

“a”表示所有 dll 都将被重新安装,不管它们的版本如何。

于 2019-09-24T14:07:31.750 回答
2

I had another solution to this problem, but the previous reply certainly pointed me in the right direction. The DLLs in my .NET project were being assigned a lower version number than my previous installation. Going to the AssemblyInfo.cs files and incrementing the third octet from 0 to 1 solved it. Wix now recognized the DLLs as newer.

[assembly: AssemblyVersion("1.0.1.*")]
于 2018-07-19T23:27:25.923 回答
0

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

这个解决方案现在对我们有用。

于 2015-11-06T10:14:37.970 回答
-1

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

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

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

于 2015-04-13T18:33:13.267 回答