WiX升级问题-文件的主要版本已增加,但修订版本较低,现在已删除旧文件,但在升级过程中未复制新文件

Bit*_*der 5 windows-installer wix upgrade wix3

我会根据目录(用于Web应用程序)自动为安装程序生成WiX文件,其中包含对以下3个.Net程序集的引用:

  • Migrator.dll
  • Migrator.Framework.dll
  • Migrator.Providers.dll

这是生成WiX片段:

<Fragment>
<DirectoryRef Id="bin">
  <Component Id="bin.Migrator.dll" Guid="*">
    <File Id="bin.Migrator.dll" Name="Migrator.dll" KeyPath="yes" Source="..\WebApplication\bin\Migrator.dll" />
  </Component>
</DirectoryRef>
</Fragment>
<Fragment>
<DirectoryRef Id="bin">
  <Component Id="bin.Migrator.Framework.dll" Guid="*">
    <File Id="bin.Migrator.Framework.dll" Name="Migrator.Framework.dll" KeyPath="yes" Source="..\WebApplication\bin\Migrator.Framework.dll" />
  </Component>
</DirectoryRef>
</Fragment>
<Fragment>
<DirectoryRef Id="bin">
  <Component Id="bin.Migrator.Providers.dll" Guid="*">
    <File Id="bin.Migrator.Providers.dll" Name="Migrator.Providers.dll" KeyPath="yes" Source="..\WebApplication\bin\Migrator.Providers.dll" />
  </Component>
</DirectoryRef>
</Fragment>
Run Code Online (Sandbox Code Playgroud)

我们使用相同的基本安装程序结构已有一年左右的时间,但是最近我们将Migrator.Net库更新为新的内部版本,该版本的版本号和程序集标题/描述属性从(从Orca倾销)更改为

  • bin.Migrator.dll bin.Migrator.dll Migrator.dll 16384 3.0.1317.0 0 512 78
  • bin.Migrator.Framework.dll bin.Migrator.Framework.dll pi0mozkr.dll | Migrator.Framework.dll 20992 3.0.1317.0 0 512 79
  • bin.Migrator.Providers.dll bin.Migrator.Providers.dll jq05waoy.dll | Migrator.Providers.dll 73216 3.0.1317.0 0 512 82

升级库后,要:

  • bin.Migrator.dll bin.Migrator.dll Migrator.dll 16384 3.2.0.1 0 512 55
  • bin.Migrator.Framework.dll bin.Migrator.Framework.dll pi0mozkr.dll | Migrator.Framework.dll 28160 3.2.0.1 0 512 56
  • bin.Migrator.Providers.dll bin.Migrator.Providers.dll jq05waoy.dll | Migrator.Providers.dll 79872 3.2.0.1 0 512 57

尽管次要版本较高,但修订版现在为1而不是1317。

从那时起,我们发现升级到新版本会导致这3个文件不会被复制(因此升级过程会删除旧文件,但不会安装新文件)。

这是否与更改的程序集的版本号相关,如果有,则有任何方法可以覆盖此行为(我们只想删除所有内容,然后复制所有内容,而不考虑版本)。

有趣的是,如果您进行安装,则重新运行安装程序并进行“修复”,它确实会复制新文件-我认为这是因为修复文件时不再存在该文件,因此文件版本检查逻辑不适用吗?

任何有关这是如何工作以及如何避免我们遇到的升级问题的提示都将不胜感激。

Ale*_*nov 0

正如链接的问题所建议的,您可以尝试重新安排RemoveExistingProducts,以便在安装任何新文件之前删除旧产品,如下所示:

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallValidate" />
    <!-- other actions -->
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)

另一种选择是修改REINSTALLMODE属性,并将emode 替换为a,这意味着它的值为amus。这样所有的文件都会被重新安装,操作时间会更长,但更可靠。