托管引导程序的 WiX 修复无法修复某些损坏的 DLL

WiX repair from managed bootstrapper fails to fix some corrupted DLLs

我有一个安装了一些 MSI 的 WiX Managed Bootstrapper 应用程序。我还有一系列的测试,锻炼了安装程序的各种功能。我遇到的问题是修复测试。该测试故意损坏我们安装的所有 DLL,然后使用“/repair /passive”标志调用 EXE 安装程序。一旦完成,大约 80% 的 DLL 将被修复,但剩余的 DLL 未受影响,因此在修复后仍然损坏。

如果我在单个 MSI 上手动 运行 msiexec,命令行参数“/fa”指示 MSI 强制替换它安装的所有文件,它会修复 100% 的 DLL。

我的问题是如何强制MBA指示每个MSI以这种方式进行修复?我已经尝试在其 .wxs 文件中的各个 MSI 上将 REINSTALLMODE 属性 设置为 'amus',但 MBA 在 运行 时间覆盖它们,这在日志中通过此行显而易见:

PROPERTY CHANGE: Modifying REINSTALLMODE property. Its current value is 'amus'. Its new value: 'cmuse'.

我还尝试将 MBA 中的属性设置为传递给每个 MSI,但它似乎没有传递它们,而是使用它的默认值。

我在这里看到很多类似的问题,但 none 实际上解决了这个具体问题。任何帮助将不胜感激。抢救我!

您的问题就在这里:

[12:25:25:874]: File: C:****\estimator.dll; Won't Overwrite;    Won't patch;    Existing file is unversioned but modified

如果安装程序无法验证版本或语言(可能还有一些其他属性?),则安装程序不想覆盖自安装以来已更改的文件。没有这些属性,它决定查看修改日期。如果它比第一次安装时更新,那么它就不会碰它,而是假设某些东西因为某种原因而改变了,而恢复它会导致某些东西失败。 (你可以阅读更多here

在这种情况下,您可以做的一件事是使用 Companion File

Set this attribute to make this file a companion child of another file. The installation state of a companion file depends not on its own file versioning information, but on the versioning of its companion parent. A file that is the key path for its component can not be a companion file (that means this attribute cannot be set if KeyPath="yes" for this file). The Version attribute cannot be set along with this attribute since companion files are not installed based on their own version.

基本上,您将 installing/uninstalling 此组件的逻辑设置为与安装中另一个组件的 "FileID" 相同。在 estimator.dll 组件的 File 标记中,删除 KeyPath="yes" 并将其替换为 CompanionFile="<NameOfAnotherFileID>"

此方法的问题是您的 DLL 可能已损坏,但它链接到的 companionFile 没有问题,因此不会重新安装。

如果这是您拥有的 dll,我强烈建议对该文件进行版本控制!给它任何你想要的版本,这个问题就会消失。

你可以尝试的另一件事是给文件一个 DefaultVersion

This is the default version of this file. The linker will replace this value from the value in the file if the suppress files option is not used.

这将是最快的验证解决方案。只需在 estimator.dll 的 <File> 中使用 DefaultVersion="1.0" 构建一个新的安装程序,然后查看它是否被替换。我认为这会让安装程序认为该文件的版本为 1.0,但安装的文件没有版本,因此它将替换它(参见 here