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

Mik*_*ike 11 windows-installer wix

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" />
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.我最终收到'错误2753文件foo.dll未标记为安装'.

小智 9

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

如何解决:

  1. 无论版本如何,都应该复制的所有文件都必须在自己的组件中
  2. 组件元素必须有一个唯一的Guid,而不是一个*
  3. 在内部File元素中设置KeyPathno

例子:

<Component Id="cmpExample" Guid="{5ABE7229-C247-4CBA-B8DE-2C4968CD103E}" >
     <File Id="fileExample" KeyPath="no" Source="$(var.TargetDir)\SomeExample.dll" />
</Component>
Run Code Online (Sandbox Code Playgroud)

我建议将所有这些component元素聚合在一个组件组中。此外,如果您使用heat.exe收集所有文件,则可以使用XML 转换来删除这些文件。

使用此解决方案,您可以复制文件,即使安装的文件版本更高。当您的升级安装更高的文件版本时,它仍然按预期工作。


mar*_*tin 5

这并不容易,因为它违反了MSI软件包的标准行为。编译时,必须在light.exe中使用-sf设置supress-file-options。然后,从您读取的文件中将没有文件信息。您可以设置DefaultVersion,将使用此版本。我也在RemoveFile解决方案中使用过,但是我可以说它有效。我已经在添加文件的同一componente中添加了它。

   <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>
Run Code Online (Sandbox Code Playgroud)

这不是一种干净的方法,但是删除旧版本对我有用。