MSI Wix升级-不时获取FileNotFoundException

问题描述

我有一个运行升级的WIX安装程序。

它成功完成了绝大多数次。但在某些情况下,我得到了: “ IO.FileNotFoundException:无法加载文件或程序集...。或其依赖项之一。系统找不到指定的文件。”

找不到的实际文件不一致,并且在错误之间进行更改。

注意我有一个WIX安装,它将多个MSI打包在一起。我遇到的错误是在升级过程中发生的,在升级过程中,我运行了一些自定义c#代码(以配置计算机和环境)。此代码不是作为自定义操作运行,而是在所有内部MSI完成(并且它们成功完成)之后运行。

由于同一安装程序几乎总是成功完成,所以我倾向于认为这是一个环境问题,但是我无法提出一个合理的理论甚至无法启动和测试该问题。

升级过程可以在Windows Server 2008 R2上运行到最新的Windows Server。

在继续之前,安装程序会确保所有.net框架先决条件都已经安装。

任何可能引起这种情况的线索将不胜感激。

解决方法

快速头脑风暴 1) 您可能已经降级了文件? 2) ,您有不匹配的组件GUID吗? 3) ,您已删除文件却没有意识到? (如果较旧的安装版本具有永久文件设置,则可以使用) 4) 您缺少先决条件吗? 5) 自定义操作可以删除文件吗? 6) 病毒扫描程序可以隔离文件吗?

有边缘和边缘情况。现在,我只能想到transitive conditions for componentsmsidbComponentAttributesTransitive =>在重新安装时可能会重新评估组件条件,可能会删除文件),但这不会影响我认为的主要升级。


降级的二进制文件 :这可能是降级的二进制文件的问题。在升级安装程序中降级二进制文件(包括较低版本的文件以替换原始安装程序中的较高版本)可能会导致文件在安装后丢失。尝试从“添加/删除程序”运行修复,然后再次启动该应用程序。如果这样可以解决问题,并且应用程序启动,则很可能会遇到此问题。我为此建议的一个丑陋修复是使用Visual Studio中的File => Open as resource作为资源将旧二进制文件的版本号更新为更高版本。 There are other ways,但出于实用原因,我使用该方法。

记录 :还有其他几种可能性。您应该做的第一件事是make a proper log file

msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log

,然后查找类似于以下内容的条目:

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

请参见this old answer from Rob Mensching himself。还有here is more from Chris Painter

记录方法 :这是MSI logging的答案。我会 enable the global logging policy so all MSI operations create a log file in the TEMP folder

不匹配的组件GUID :除非将文件移动到另一个位置(在源媒体中,换句话说,将文件安装到另一个绝对位置),否则应在设置之间保持组件GUID稳定。目标路径)。如果您对RemoveExistingProducts操作进行排序以使其延迟运行,则组件引用错误可能会导致文件在重大升级后丢失,因为在这种情况下安装程序会强制执行组件规则(对于早期排序,这些规则可能会发生变化)。

  • 如果使用不匹配的组件GUID,换句话说,对于以相同绝对路径为目标的文件,组件GUID不会保持稳定,而对。

  • When should you change component GUIDs?(推荐)。