我有一个安装萨姆文件(.NET程序版本6.0.0.0)一个非常简单的WiX工程(3.7版)。 我已经准备好使用维克斯的MajorUpgrade功能来发布一个新版本6.0.1.0。
我保持的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>
在<ComponentGroup>(一些修改,一些未经修饰的含其他第三方的DLL)被正确安装所有其他文件的主要升级过程中。
如果我的主要升级后的“修复”点击,2页丢失的文件重新出现。 另外,如果我(一个干净的机器上没有升级,但首先安装)安装的第一次版本6.0.1.0,那么这些2个文件直接和正常安装。 (几个Windows机测试(XP,7和8)
任何人的任何建议,什么是错的,如何解决?
所提供的日志文件显示已经在机器上的几个文件更新版本:
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'
应该做的伎俩。 你需要更加小心的组件规则 。
另外,恕我直言,第三方供应商不应该被更新MSI之外的文件。 他们的决定是迫使你的产品进入升级换代的一种特殊方式。
日志文件会有所帮助。 我的猜测是它的基础上,你必须安排RemoveExistingProducts。 我见过的情况下成本法计算出所安装的文件是一样已经安装的文件,并决定不安装该文件。 然后发生了重大升级和你最终没有文件。 修复工作,因为该文件不存在,耗资意识到它需要安装。
我有另外的解决了这个问题,但以前肯定的答复我指出了正确的方向。 在我的.NET项目中的DLL被分配比我以前安装低版本号。 要去的AssemblyInfo.cs文件,并从0到1增加第三个八位字节解决它。 维克斯目前公认的DLL文件是新。
[assembly: AssemblyVersion("1.0.1.*")]
在旧版本的Windows Installer的问题记录在这里:
https://support.microsoft.com/en-us/kb/905238
受影响的产品列表inplies,它的固定在MSI引擎4.0和更高版本。 做安装前使用4.5可再发行应该帮助,如果适用于OS版本。
错误仍然存在于安装5.0,仍然是一个问题。 解决方法放置RemoveExistingProduct
后InstallFinalize
对我们来说是无解的。 我不得不对单个文件的属性设置的更新。
该解决方案现在为我们工作。