为什么我的安装程序正在搜索另一个不存在的 MSI?

Why is my installer searching for another, non-existent MSI?

我的安装程序最近在升级期间开始崩溃。放下文件后,它会显示一个框,上面写着:

A network error occurred while attempting to read from the file: C:\Users\user\AppData\Local\Temp\MyInstaller.msi

我确信这个错误是正确的,因为我们从未发送过文件 MyInstaller.msi。我按照 MyInstaller.exe 使用自定义 bootstrap 发送 Package.msi,bootstrap,然后使用 MyInstaller.exe 调用 msiexec /i Package.msi.

直到最近 Package.msi 在显然试图寻找 MyInstaller.msi 时开始失败时,它一直运行良好。它为什么要这样做? Wilogutl.exe 只说“标准或自定义操作似乎失败了。”这不是很有帮助。

我仍然不确定为什么会这样,但我发现了一个可能相关的日志部分:

MSI (c) (D0:54) [09:03:23:868]: Entering CMsiConfigurationManager::SetLastUsedSource.

MSI (c) (D0:54) [09:03:23:869]: Specifed source is already in a list.

MSI (c) (D0:54) [09:03:23:869]: User policy value 'SearchOrder' is 'nmu'

MSI (c) (D0:54) [09:03:23:869]: Machine policy value 'DisableBrowse' is 0

MSI (c) (D0:54) [09:03:23:869]: Machine policy value 'AllowLockdownBrowse' is 0

MSI (c) (D0:54) [09:03:23:869]: Adding new sources is allowed.

MSI (c) (D0:54) [09:03:23:869]: PROPERTY CHANGE: Adding PackagecodeChanging property. Its value is '1'.

MSI (c) (D0:54) [09:03:23:869]: Package name retrieved from configuration data: 'MyInstaller.msi'

MSI (c) (D0:54) [09:03:23:869]: Note: 1: 2205 2: 3: Error

MSI (c) (D0:54) [09:03:23:871]: Note: 1: 2262 2: AdminProperties 3: -2147287038

MSI (c) (D0:54) [09:03:23:871]: Machine policy value 'DisableMsi' is 1

MSI (c) (D0:54) [09:03:23:871]: Machine policy value 'AlwaysInstallElevated' is 0

另一个奇怪的地方:Add/Remove 程序显示安装了旧版本并且我的二进制文件证实了这一点。但是,如果我尝试直接 运行 新版本的 MSI,我会收到错误消息:

Another version of this product is already installed. Installation of this version cannot continue...

当我在开发过程中尝试安装具有相同版本但不同包代码的 MSI 时,我经常收到此错误消息。不过Orca表示新的MSI肯定是更高版本

关于您最后关于相同版本但不同包代码的评论,版本可能有些无关紧要。 ProductCode 定义产品已安装,因此尝试安装具有相同 ProductCode(但不同版本)的其他产品将导致该消息。 PackageCode 很重要,但大多数工具只是在每次构建时生成一个新的,所以这通常不是问题。因此,如果您真的要进行升级,您应该在前三个字段的某处有一个 WiX 主要升级元素和一个新的 ProductCode 和 ProductVersion 增量。

如果这是在客户端系统上,他们是否安装了其他产品?您是否安装了任何可能与其他产品共享的相当常见的项目(可能来自合并模块)?例如,如果您要安装一个常用共享文件(Crystal Reports、C++ Dll 等),其组件 ID 会中断共享,那么您可能会触发 Windows 以尝试通过以下方式解决共享版本问题到另一个 MSI 文件。顺便说一下,当 MSI 安装使用 "version lying" 时,当实际安装的文件的版本与 MSI 文件 Table 中的版本不同时,这可能是一个常见问题。此外,请查看 Windows 事件日志、应用程序、MsiInstaller 条目,因为可能有一个条目的组件 ID 被列为修复触发器并从其包含的产品 MSI 文件中获取文件。

为了让事情变得更加混乱,1 的 DisableMSI 策略会阻止某些安装(请参阅文档)。

在我不知道的情况下,windows 缓存用于最初安装产品的 MSI 的文件名。因此,当我 运行 旧版本时,我的引导程序将 MSI 卸载为 MyInstaller.msi,并安装我的产品。

我最近更改了引导程序以将其卸载为 Package.msi。现在,在这些神秘的条件下,windows 将文件名缓存为 MyInstaller.msi,并且在 运行ning Package.msi 尝试返回 MyInstaller.msi 的过程中不再存在。

我不知道它为什么这样做或如何让它停止,但我已经恢复我的更改并再次从引导程序卸载我的 MSI 作为 MyInstaller.msi