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

时间:2016-08-18 21:20:39

标签: wix windows-installer bootstrapper burn repair

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

如果我使用命令行args“/ fa”在单个MSI上手动运行msiexec,它指示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,但它似乎没有传递它们,而是使用它的默认值。

我在这里看到很多类似的问题,但没有一个真正解决这个具体问题。任何帮助将不胜感激。抢救我!

1 个答案:

答案 0 :(得分:1)

这就是你的问题:

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

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

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

  

设置此属性可使此文件成为另一个文件的伴随子级。协同文件的安装状态不取决于其自己的文件版本控制信息,而是取决于其伴随父级的版本控制。作为其组件的关键路径的文件不能是伴随文件(这意味着如果KeyPath ="是"对于此文件,则无法设置此属性)。版本属性不能与此属性一起设置,因为未根据自己的版本安装随播文件。

基本上,您将设置安装/卸载此组件的逻辑与&#34; FileID&#34;相同。安装中的另一个组件。在estimator.dll组件的“文件”标记中,删除KeyPath="yes",然后将其替换为CompanionFile="<NameOfAnotherFileID>"

这种方法的问题是你可能有一个损坏的DLL但它链接到的companionFile很好,所以它没有重新安装。

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

你可以尝试的另一件事,虽然我不知道它是如何工作的,但是给文件一个DefaultVersion

  

这是此文件的默认版本。如果未使用suppress files选项,链接器将从文件中的值替换此值。

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