Installation Wix-升级总是运行较旧的安装程序msi,并且在尝试读取旧msi时失败

Installation Wix-升级总是运行较旧的安装程序msi,并且在尝试读取旧msi时失败,installation,wix,windows-installer,upgrade,Installation,Wix,Windows Installer,Upgrade,不过,安装程序的Windows缓存有问题。我正在尝试升级,每次Windows安装程序启动旧版本的安装程序时。当我升级时,它抱怨读取旧版本的msi文件时出现问题(因为它不再位于同一目录中) 我确实更改了UpgradeCode和ProductCode,但保持了PackageCode不变。我也有不同的产品版本代码(2.2.3和2.3.0) 以下是我的代码示例: <Upgrade Id="$(var.UpgradeCode)"> <UpgradeVersion Proper

不过,安装程序的Windows缓存有问题。我正在尝试升级,每次Windows安装程序启动旧版本的安装程序时。当我升级时,它抱怨读取旧版本的msi文件时出现问题(因为它不再位于同一目录中)

我确实更改了UpgradeCode和ProductCode,但保持了PackageCode不变。我也有不同的产品版本代码(2.2.3和2.3.0)

以下是我的代码示例:

<Upgrade Id="$(var.UpgradeCode)">
      <UpgradeVersion Property="OLDAPPFOUND"
                  IncludeMinimum="yes"
                  Minimum="$(var.RTMProductVersion)"
                  IncludeMaximum="no"
                  Maximum="$(var.ProductVersion)"/>
  <UpgradeVersion Property="NEWAPPFOUND"
                  IncludeMinimum="no"
                  Minimum="$(var.ProductVersion)"
                  OnlyDetect="yes"/>
</Upgrade>

以下是安装顺序:

<InstallExecuteSequence>
    <Custom Action='SetUpgradeParams' After='InstallFiles'>Installed AND NEWAPPFOUND</Custom>
      <Custom Action='Upgrade' After='SetUpgradeParams'>Installed AND NEWAPPFOUND</Custom>
   </InstallExecuteSequence>

已安装并找到新的AppFound
已安装并找到新的AppFound
我得到的错误是:

尝试读取文件时发生网络错误:


谢谢,

您需要保持升级代码不变,并更改产品代码(如果您想要升级)

在InstallExecuteSequence中,需要以下行

<RemoveExistingProducts After="InstallInitialize" />

在本例中,我选择将操作放在installInitialize序列之后,但是您可以将它们放在其他位置,这将给您带来不同的效果

以下是源代码(或者尽可能多地提供):

http://schemas.microsoft.com/wix/2003/01/wi“>


.....
......
新产品发现
协议=“安全”
非(PROTOCOL=“secure”)或非协议
未安装且未修补
未安装且未修补
未安装且未修补
未安装且未修补
已安装并已升级
已安装并已升级
已安装但未删除=“全部”且未找到NEWAPPFOUND
已安装但未删除=“全部”且未找到NEWAPPFOUND
已安装并删除=“全部”,而不是新AppFound
已安装并删除=“全部”,而不是新AppFound
新产品发现


你的产品元素是怎么说的

您需要在升级表和产品表中指定相同的升级代码

<Product 
   Id="..." 
   Language="..." 
   Manufacturer="..." 
   Name="..." 
   UpgradeCode="$(var.UpgradeCode)" 
   Version="..."
>

而且它也需要在原始版本中,如果它最初没有在那里指定,那么也许您可以使用shell命令运行CA来删除它

除此之外,一切看起来都不错

日志中的“Findrelatedproducts”部分是否有任何说明?

DoNOT保持不变。 你真的想让它自动生成。。。请参阅文档:

不应使用不相同的.msi文件 具有相同的包代码。它是 更改包代码很重要 因为它是主标识符 安装程序用于搜索 并验证一个 给定安装。如果一个包裹是 更改而不更改包 代码时,安装程序可能不会使用 更新的软件包,如果两者都是 安装程序可以访问

下面是我们生产环境中的一个示例

<Product Id="*"
         UpgradeCode="$(var.Property_UpgradeCode)"
         Name="!(loc.ApplicationName)"
         Language="!(loc.Property_ProductLanguage)"
         Version="$(var.version)"
         Manufacturer="!(loc.ManufacturerName)" > 

<Package Description="!(loc.Package_Description) $(var.version)"
   Comments="!(loc.Package_Comments)"
   Manufacturer="!(loc.ManufacturerName)"
   InstallerVersion="301"
   Compressed="yes"
   InstallPrivileges="elevated"
   InstallScope="perMachine"
   Platform="$(var.ProcessorArchitecture)" />

现在这种方法的缺点是,它意味着您可能还希望强制执行主要升级,这只关心所引用的升级代码。现在,我们可以利用以下事实:对于Windows Installer软件包,只有前三个字段是重要的,例如,1.0.0.1和1.0.0.2都被解释为1.0.0(文档中明确提到了这一点,因此我们可以依赖它)

扩展此逻辑,我们可以在每次构建时自动增加(忽略的)第四个版本字段,但在前三个版本相同时防止升级

    <UpgradeVersion Property="ANOTHERBUILDINSTALLED"
             Maximum="$(var.version)" Minimum="$(var.version)"
             IncludeMinimum="yes" IncludeMaximum="yes" OnlyDetect="yes" />


好处是这对客户来说是完全透明的,但是防止内部测试/质量保证团队在另一个“构建”之上安装一个“构建”,并且您还需要确保在任何公开发布后立即手动增加前三个版本字段中的一个。

感谢您的回复。然而,我确实尝试了你的建议。我保留了相同的升级代码,更改了产品和包装代码。但每次运行新的msi时,都会提示我执行新产品的新安装。Windows installer似乎假定这是要安装的另一个产品,而不是现有产品的升级。很抱歉,我最初编写的内容中有一个错误,每次构建msi时都应该保留程序包代码,因为您会自动获得一个新的程序包代码,只有在需要升级时才应更改产品代码。能否提供完整的源代码以及安装日志。感谢您的快速回复。我之前浏览过Alex的博客,我甚至修改了代码来实现它,但它仍然给出了我之前提到的相同错误。安装日志仅显示初始软件包的成功安装,但没有显示升级的任何信息。我将在另一封邮件中附上源代码。谢谢大家的回复。我想出了一种不同的升级方法。问题是,我们的升级没有使用默认的Windows Installer升级,而是执行JavaScript中详细说明的自定义操作。不管怎样,我现在遇到了一个不同的问题。我不知道我是否需要一个新的线程,或者是否有人可以在这里帮助我:我们的旧安装程序不支持升级,并且不包含“升级”按钮。较新的安装程序支持使用较新的品牌图像进行自己版本的升级。问题在于启动新的msi。我得到了新的品牌图片,但升级按钮没有显示在安装程序中?!阅读日志,我还可以看到它正在启动旧的msi的WIX UI代码。Windows Installer为什么会从新的msi和旧的msi中选择要显示的内容?!我怎样才能清除旧msi的缓存?!谢谢
    <UpgradeVersion Property="ANOTHERBUILDINSTALLED"
             Maximum="$(var.version)" Minimum="$(var.version)"
             IncludeMinimum="yes" IncludeMaximum="yes" OnlyDetect="yes" />