如何让wix更新以前安装的程序版本

我用wix编写了一个安装程序,安装我的程序工作正常。 现在我需要更新它,所以我碰到了版本号,但是当我去安装新的程序时,它抱怨已经安装了一个旧版本,并告诉我先卸载它。

如何在重新安装之前更新或自动卸载它?

我觉得所提供的答案没有一个是完整的或者是独立的,所以在深入了解这个沼泽之后,我认为有必要使这个更新的(完全不言而喻的)要求工作:

  1. 确保您的产品ID每次构build时都会更改。 如果你不这样做,你总会得到OP提到的“已经安装”的信息。

    <Product Id="*" ...> 
  2. 每次产品本身发生变化时都要更改产品版本。 我想最好的select是将它绑定到程序集版本(也应该自动增加),但是当然你也可以手动修改它。 如果您在第4点中使用AllowSameVersionUpgrades属性,则此步骤并不是严格要求的,但我敢说,保持产品版本不变是不好的做法。

     <Product Version="!(bind.FileVersion.MyAssemblyDll)" ...> <File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" /> 
  3. 保持您的UpgradeCode不变(例如):

     <Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...> 
  4. 添加MajorUpgrade元素(来自Wix 3.5.1315.0)。 要绕过MajorUpgrade将忽略产品版本的修订版本号更改的捕获,请添加AllowSameVersionUpgrades(或者如果您更喜欢AllowDowngrades)属性。 这样,你就可以从1.0.0.7升级到1.0.0.8 。 而不仅仅是从1.0.7.01.0.8.0 。 如果您不这样做,您可能会在程序和function中看到多个安装。

     <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 

这里是我的整个.wix文件(相关部分,导致用于产品绑定的程序集的两个片段大多是可选的,为了说明,任何可以获得组件的方法都可以):

 <?xml version="1.0" encoding="UTF-8"?> <?define ProductVersion="!(bind.FileVersion.MyAssemblyDll)"?> <?define UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"> <Product Id="*" Name="My Product's name" Language="1033" Version="$(var.ProductVersion)" Manufacturer="My company" UpgradeCode="$(var.UpgradeCode)" Codepage="1252"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perUser" Description="My product description" Manufacturer="My company" Languages="1033" SummaryCodepage="1252" InstallPrivileges="limited" /> <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed. If you are sure you want to downgrade, remove the existing installation via Programs and Features." /> </Product> <Fragment> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="LocalAppDataFolder"> <Directory Id="INSTALLFOLDER" Name="My Install Dir" > <Component Id="INSTALLFOLDER" Guid="f6ba8a12-6493-4911-8edd-dce90e1d8e8b" > <RemoveFolder On="both" Id="INSTALLFOLDER"/> <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="My Registry value" /> </Component> </Directory> </Directory> </Directory> </Fragment> <Fragment> <ComponentGroup Id="ProductComponents" > <Component Id="ProductComponent" Guid="1939f0f5-19f6-498b-bf95-8f1c81501294" DiskId="1" Directory="INSTALLFOLDER" > <File Id="MyAssemblyDll" Name="$(var.001_MyApplication.MyAssembly.TargetFileName)" Source="$(var.001_MyApplication.MyAssembly.TargetPath)" /> </Component> </ComponentGroup> </Fragment> </Wix> 

我检查了上面提到的所有post, 仍然花了很多年试图让这个工作。

步骤3中的官方HOWTO升级 提示帮助了很多:您需要一个新的Product/@Id来禁用“此产品的另一个版本已经安装”的消息。

我使用这个升级部分(产品的孩子):

 <Upgrade Id="$(var.UpgradeCode)"> <UpgradeVersion Minimum="1.0.0" IncludeMinimum="yes" OnlyDetect="no" Maximum="$(var.Version)" IncludeMaximum="no" Property="PREVIOUSFOUND" /> </Upgrade> 

请注意, OnlyDetect设置为“否”。 这会触发删除旧版本,如果您有以下部分(产品的子代):

 <InstallExecuteSequence> <RemoveExistingProducts After="InstallInitialize"/> </InstallExecuteSequence> 

另外请注意,显然,只有版本号的前三个组件用于检查升级…

你需要使用升级表:

 < Upgrade Id='15E2DAFB-35C5-4043-974B-0E342C25D76A'> < UpgradeVersion Property='OLDVERSIONFOUND' IncludeMinimum='no' Minimum='0.0.0.0' /> < /Upgrade> 

你还需要添加一个动作:

  < InstallExecuteSequence> < LaunchConditions After='AppSearch' /> < RemoveExistingProducts After='InstallValidate' /> < /InstallExecuteSequence> 

这里是一个教程

我试过这个,它为我工作。

  1. 把你的产品标签如下所示:

    Product Id =“*”Name =“Something”Language =“1033”Version =“1.0.0.0”Manufacturer =“Someone”UpgradeCode =“43ab28d7-6681-4a05-a6b5-f980733aeeed”

应将产品ID设置为*,以便每次构build项目时都需要不同的ID。

  1. 在您的Package元素中embedded一个MajorUpgrade标签,如下所示:

    MajorUpgrade AllowDowngrades =“no”DowngradeErrorMessage =“已经安装了[ProductName]的更新版本。” AllowSameVersionUpgrades =“yes”/

因此,每次更新版本(或者版本相同,不less于当前版本)时,都会通过删除以前的文件并安装产品文件来重新安装产品。 它不会降级你的产品。

只要把这个元素放在Product元素下:

 <MajorUpgrade AllowDowngrades="yes" /> 

更多信息在这个HowTo