使用WiX安装文件,无论版本号如何

时间:2009-12-16 21:30:03

标签: wix windows-installer

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未标记为安装'。稍后。

5 个答案:

答案 0 :(得分:8)

这个帖子有10年历史了,真是太疯狂了,我们也有这个问题。其他方法对我们不起作用。

解决方法:

  1. 所有应复制的文件,无论其版本如何,都必须位于其自己的组件中
  2. Component元素必须具有唯一的Guid,而不是*
  3. 在内部File元素中将KeyPath设置为no

示例:

<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>