MyApp版本1.0包含文件foo.dll。此文件的版本是10.5.567版。现在MyApp是2.0版,foo.dll版本是2.0.123。版本低于旧版本。编写此dll的供应商决定使用文件版本号向后退。这不是我可以改变的决定。
如何让WiX始终安装此文件?
RemoveExistingProducts操作在InstallFinalize操作之后计划,也无法更改。
InstallShield有一个'always overwrite'标志,但我认为如果不通过编译器开关改变所有文件的行为,我就不能模仿它。我不想要这个。我只是想更新这个文件。
我也试过
<RemoveFile Id="foo.dll" On="install" Name="foo.dll" />
但这也不起作用。我最终得到'错误2753文件foo.dll未标记为安装'。稍后。
答案 0 :(得分:8)
这个帖子有10年历史了,真是太疯狂了,我们也有这个问题。其他方法对我们不起作用。
解决方法:
示例:
<Component Id="cmpExample" Guid="{5ABE7229-C247-4CBA-B8DE-2C4968CD103E}" >
<File Id="fileExample" KeyPath="no" Source="$(var.TargetDir)\SomeExample.dll" />
</Component>
我建议将所有这些component
元素汇总到一个组件组中。此外,如果您使用XML Transformation来收获所有文件,则可以使用heat.exe摆脱那些文件。
使用此解决方案,即使安装的文件版本更高,也可以复制文件。当您在升级时安装更高版本的文件时,它仍然可以按预期工作。
答案 1 :(得分:4)
这并不容易,因为它违反了MSI包的标准行为。编译时,必须在light.exe中使用-sf设置supress-file-options。然后,您的文件中没有文件信息读取。您可以设置DefaultVersion将使用此版本。
我也在解决方案中使用了RemoveFile
,但我可以说它有效。我已将它添加到我添加文件的同一个组件中。
<Component>
<File DiskId="1" Id="fooDLL" Name="foo.dll" Vital="yes"
DefaultVersion="$(var.MAJORVERSION).$(var.MINORVERSION).$(var.BUILDVERSION)"
DefaultLanguage="0"></File>
<RemoveFile Id='RemoveOldDLL' On='install' Name='foo.dll'/>
</Componente>
这不是一种干净的方式,但要删除旧版本,它对我有用。
答案 2 :(得分:1)
我回答了一个类似的问题: Forcing an upgrade of a file that is modified during its initial installation
我想我会使用一个配套文件来解决这个问题,但是你可能会得到验证错误,因为有问题的文件是一个dll,因此被认为是可执行文件。我相信它仍然可行,而且可靠。
答案 3 :(得分:0)
注释
强制始终使用“InstallShield技巧”在Light.exe输出中覆盖:
XPath =“/ wixOutput / table [@ name ='File'] / row / field [5]”InnerText =“65535.0.0.0”
答案 4 :(得分:-1)
值得尝试的一件事是在序列的早期设置RemoveExistingProducts。然后,MSI应首先删除旧程序,然后安装升级。这将解决您的问题。 e.g。
<InstallExecuteSequence>
<RemoveExistingProducts After="CostFinalize" />
</InstallExecuteSequence>