我的安装程序最近在升级过程中开始崩溃。放下文件后,它会显示一个框,上面写着:
尝试读取文件时发生网络错误:C:\Users\user\AppData\Local\Temp\2\MyInstaller.msi
我确信此错误是正确的,因为我们从未MyInstaller.msi
运送过文件。我Package.msi
发货,使用自定义引导程序作为MyInstaller.exe
引导它,然后使用MyInstaller.exe
调用msiexec /i Package.msi
。
这一直很有效,直到最近Package.msi
开始失败,而显然是在试图寻找MyInstaller.msi
.为什么要这样做?Wilogutl.exe只说"标准或自定义操作似乎失败了",这不是很有帮助。
我仍然不确定为什么会发生这种情况,但我找到了一个可能相关的日志部分:
MSI (c) (D0:54) [09:03:23:868]:正在输入 CMsiConfigurationManager::SetLastUsedSource。
MSI (c) (D0:54) [09:03:23:869]: 指定的源已在列表中。
MSI (c) (D0:54) [09:03:23:869]:用户策略值"搜索顺序"为"nmu"
MSI (c) (D0:54) [09:03:23:869]:计算机策略值"禁用浏览"为 0
MSI (c) (D0:54) [09:03:23:869]:计算机策略值"允许锁定浏览"为 0
MSI (c) (D0:54) [09:03:23:869]: 允许添加新源。
MSI (c) (D0:54) [09:03:23:869]: 属性更改: 添加包代码更改属性。其值为"1"。
MSI (c) (D0:54) [09:03:23:869]:从配置数据中检索的程序包名称:"我的安装程序.msi"
MSI (c) (D0:54) [09:03:23:869]: 注意: 1: 2205 2:3: 错误
MSI (c) (D0:54) [09:03:23:871]:注意:1:2262 2:管理属性 3:-2147287038
MSI (c) (D0:54) [09:03:23:871]:计算机策略值"禁用 Msi"为 1
MSI (c) (D0:54) [09:03:23:871]:计算机策略值"始终安装提升"为 0
另一个奇怪之处:添加/删除程序显示已安装旧版本,我的二进制文件确认了这一点。但是,如果我尝试直接运行新版本的 MSI,则会收到错误消息:
在已安装此产品的另一个版本。安装此版本无法继续...
开发过程中,当我尝试安装具有相同版本但不同包代码的 MSI 时,我经常收到此错误消息。但是,Orca表示新的MSI绝对是更高的版本。
关于您关于相同版本但不同包代码的最后评论,该版本可能有些无关紧要。ProductCode 定义了产品已安装,因此尝试安装具有相同 ProductCode(但版本不同)的其他内容将导致该消息。PackageCode 很重要,但大多数工具只是在每次构建时生成一个新工具,因此这通常不是问题。因此,如果您真的在进行升级,您应该在前三个字段中有一个WiX主要升级元素和新的产品代码和产品版本增量。
如果这是在客户端系统上,他们是否可以安装该其他产品?您是否安装了可能与其他产品共享的任何相当常见的项目(可能来自合并模块)?例如,如果您要安装一个常用共享文件(水晶报告、C++ DLL 等),其组件 ID 会破坏共享,那么您可能会触发 Windows 尝试通过转到另一个 MSI 文件来解决共享版本问题。顺便说一下,当实际安装的文件的版本与 MSI 文件的文件表中的版本不同时,当 MSI 安装使用"版本谎言"时,这可能是一个常见问题。此外,请查看 Windows 事件日志、应用程序、MsiInstaller 条目,因为可能有一个条目的组件 ID 被列为修复的触发器,并从其包含的产品 MSI 文件中获取文件。
只是为了让事情更加混乱,1 的 DisableMSI 策略会阻止某些安装(请参阅文档)。
在我自己不知道的情况下,Windows 会缓存最初用于安装产品的 MSI 的文件名。因此,当我运行旧版本时,我的引导程序会卸载 MSI 作为MyInstaller.msi
,并安装我的产品。
我最近更改了引导程序以将其卸载为Package.msi
.现在,在这些神秘的条件下,Windows 将文件名缓存为 MyInstaller.msi
,并在运行过程中尝试Package.msi
尝试引用不再存在的MyInstaller.msi
。
我不知道它为什么要这样做或如何让它停止,但我已经恢复了我的更改,并再次从引导程序中卸载我的 MSI 作为MyInstaller.msi
.