3

因此,我有一个使用 WiX 编写的产品安装程序,一旦合并了“Microsoft_VC100_CRT_x86.msm”合并模块,它就无法正确升级。安装过程中不会删除旧产品。如果从项目中删除合并模块,则会按原样删除旧版本。

合并模块非常简单地包含在 Directory 节点下:

<Directory Id="ProgramFilesFolder">
  <Merge Id="VC10_CRT_MergeId1" Language="0" SourceFile="c:\\Program Files (x86)\\Common Files\\Merge Modules\\Microsoft_VC100_CRT_x86.msm" DiskId="1" />
... other stuff
</Directory>

然后在特性中引用:

<Feature Id="MainFeature" Title="Core Files" Level="1">
  <MergeRef Id="VC10_CRT_MergeId1" />
  ... other stuff
</Feature>

我正在增加产品的版本号,但升级失败,新版本安装在旧版本之上,但没有执行正确的升级 - 两个版本都列在“添加或删除程序”中。

旧产品应按如下方式删除:

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallValidate'/>
</InstallExecuteSequence>

我还根据http://jpassing.com/2007/06/16/where-to-place-removeexistingproducts-in-a-major-msi-upgrade/尝试了 RemoveExistingProducts 的各种其他职位,结果相同。

在安装程序的详细日志中可以看到以下内容:

MSI (s) (AC:44) [19:48:22:300]: Doing action: RemoveExistingProducts
MSI (s) (AC:44) [19:48:22:300]: Note: 1: 2205 2:  3: ActionText 
Action start 19:48:22: RemoveExistingProducts.
MSI (s) (AC:44) [19:48:22:300]: Note: 1: 2205 2:  3: Error 
MSI (s) (AC:44) [19:48:22:300]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 22 
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2205 2:  3: Error 
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 23 
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2205 2:  3: Error 
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 16 
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2205 2:  3: Error 
MSI (s) (AC:44) [19:48:22:301]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 21 
Action ended 19:48:22: RemoveExistingProducts. Return value 1.

在 WiX 构建日志中,我得到以下信息(但从内存中这对于 VC 运行时 msms 来说是正常的?):

1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 1 in the table InstallExecuteSequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 1 in the table InstallUISequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 3 in the table AdminExecuteSequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 3 in the table AdminUISequence
1>light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder_x86_VC.F1DD796A_B984_3DCA_A68D_6B352BDC86F3 has duplicate sequence number 3 in the table AdvtExecuteSequence

msi 中的 InstallExecuteSequence 如下所示:

在此处输入图像描述

如果删除了合并模块(由于安装程序中的文件更新,需要将其包含在内),则升级将按预期进行。这是合并模块的东西/WiX/Windows 安装程序中的错误,还是我做错了什么?

4

2 回答 2

0

您在升级时没有收到任何错误消息?它通过了,但你留下了两个添加/删除条目和一个混乱的文件系统?听起来您的两个版本不共享相同的升级代码。

如果您尝试进行小升级,则不会触发 RemoveExistingProducts。文件应该更新,但您将保留一个添加/删除条目。

如果您尝试进行将触发 RemoveExistingProducts 的重大升级,但您需要正确设置升级元素

另外,作为提示,不要使用合并模块。由于 Windows Installer 组件规则的工作方式,在小升级时,您无法删除合并模块添加的组件。您将需要进行重大升级。(或者手动将旧合并模块中的所有组件代码添加到您的项目中。不好玩。)根据您所有东西的设置方式,强制进行重大升级可能会很麻烦。

如果您添加合并模块并且稍后需要将其删除,您将遇到此问题。或者,如果您想将 VS 2010 模块替换为 VS 2012 模块。MS 甚至打破了服务包之间的组件规则一次。通过在产品安装期间或之前运行 vcredist*.exe 来安装它们要容易得多。

于 2013-04-10T03:46:25.737 回答
0

你发现问题了吗?检查您正在添加的合并模块的版本是否比您正在安装的系统上已经存在的版本旧。在这种情况下,MSI 会删除 VC++ 文件,但不会放下新文件,因为它们较旧。

编辑:我找到了解决您问题的方法!!你应该使用: RemoveExistingProducts After="InstallFinalize

参考:http: //blogs.msdn.com/b/astebner/archive/2007/02/08/assemblies-may-be-missing-from-the-gac-or-winsxs-cache-after-an-msi-主要升级.aspx

我有同样的问题,改变这个解决了它。

于 2013-04-17T16:59:22.290 回答