首页 > 解决方案 > MSI wix 升级 - 不时收到 FileNotFoundException

问题描述

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

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

未找到的实际文件不一致,并且在错误之间发生变化。

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

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

此升级过程可以在 windows server 2008 r2 上运行到最新的 windows server。

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

任何有关发生这种情况的可能原因的线索将不胜感激。

标签: c#wixwindows-installer

解决方案


快速头脑风暴1)您可以降级文件吗?2)您的组件 GUID 不匹配?3)您在不知不觉中删除了文件?(如果较旧的安装版本具有永久文件集,则可以工作)4)您缺少先决条件吗?5)自定义操作可以删除文件吗?6)病毒扫描程序可以隔离文件吗?

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


降级二进制:可能是降级二进制的问题。在升级设置中降级二进制文件(包括用较低版本的文件替换原始设置中的较高版本)可能会导致安装后文件丢失。尝试从添加/删除程序运行修复并再次启动应用程序。如果这解决了问题并且应用程序启动了,那么您很可能会遇到这个问题。我为此推荐的一个丑陋的修复方法是在 Visual Studio 中使用 File => Open as resource 将旧二进制文件的版本号更新为更高版本。还有其他方法,但出于务实的原因,我使用这种方法。

记录:还有其他几种可能性。您应该做的第一件事是制作一个正确的日志文件

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

请参阅Rob Mensching 本人的这个旧答案。这里有更多来自 Chris Painter 的内容

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

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

  • 如果您使用不匹配的组件 GUID - 换句话说,对于针对相同绝对路径的文件,您不会保持组件 GUID 稳定,并且您对 .

  • 何时应更改组件 GUID?(推荐的)。


推荐阅读