【问题标题】:MSI wix upgrade - getting FileNotFoundException from time to timeMSI wix 升级 - 不时收到 FileNotFoundException
【发布时间】:2020-10-28 13:19:33
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 比较前后文件夹时,您发现哪些文件丢失了?二进制文件?配置文件?您自己的文件或运行时组件?有时,在旧设置中意外删除并标记为永久的文件会使新设置看起来有效。我不认为这是你的情况。
  • 编辑了问题 - 看到失败发生在升级过程中,而不是在部署的代码中。 AFAIK - 安装程序将自身部署到安装完成后清除的临时文件夹,因此我没有机会比较执行文件夹
  • 或许先将安装文件夹复制到桌面,然后与安装后的状态进行diff。如果此捆绑包中有许多 MSI 设置,它们之间可能会有不同的错误。您部署了哪些运行时以及 GAC 是否参与?

标签: c# wix windows-installer


【解决方案1】:

快速头脑风暴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?(推荐)。

【讨论】:

  • tnx 获取信息,我编辑了我的问题以强调错误发生在升级过程本身而不是在部署的代码中
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多