问题描述
它成功完成了绝大多数次。但在某些情况下,我得到了: “ IO.FileNotFoundException:无法加载文件或程序集...。或其依赖项之一。系统找不到指定的文件。”
注意:我有一个WIX安装,它将多个MSI打包在一起。我遇到的错误是在升级过程中发生的,在升级过程中,我运行了一些自定义c#代码(以配置计算机和环境)。此代码不是作为自定义操作运行,而是在所有内部MSI完成(并且它们成功完成)之后运行。
由于同一安装程序几乎总是成功完成,所以我倾向于认为这是一个环境问题,但是我无法提出一个合理的理论甚至无法启动和测试该问题。
此升级过程可以在Windows Server 2008 R2上运行到最新的Windows Server。
在继续之前,安装程序会确保所有.net框架先决条件都已经安装。
任何可能引起这种情况的线索将不胜感激。
解决方法
快速头脑风暴 : 1)
您可能已经降级了文件? 2)
,您有不匹配的组件GUID吗? 3)
,您已删除文件却没有意识到? (如果较旧的安装版本具有永久文件设置,则可以使用) 4)
您缺少先决条件吗? 5)
自定义操作可以删除文件吗? 6)
病毒扫描程序可以隔离文件吗?
有边缘和边缘情况。现在,我只能想到transitive conditions for components(msidbComponentAttributesTransitive
=>在重新安装时可能会重新评估组件条件,可能会删除文件),但这不会影响我认为的主要升级。
降级的二进制文件 :这可能是降级的二进制文件的问题。在升级安装程序中降级二进制文件(包括较低版本的文件以替换原始安装程序中的较高版本)可能会导致文件在安装后丢失。尝试从“添加/删除程序”运行修复,然后再次启动该应用程序。如果这样可以解决问题,并且应用程序启动,则很可能会遇到此问题。我为此建议的一个丑陋修复是使用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不会保持稳定,而对。