74

我用 Wix 编写了一个安装程序,它可以很好地安装我的程序。现在我需要更新它,所以我提高了版本号,但是当我在旧程序上安装新程序时,它抱怨已经安装了旧版本并告诉我先卸载它。

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

4

5 回答 5

107

我觉得所提供的答案都不是完整的或独立的,所以在我通过这个沼泽挖掘我的方式之后,以下是我认为获得更新的(完全不言而喻的)要求所必需的步骤:

  1. 确保每次构建时您的产品 ID 都会更改。如果不这样做,您将始终收到 OP 提到的“已安装”消息。

    <Product Id="*" ...>
    
  2. 每次产品本身更改时更改产品版本。我想最好的选择是将它绑定到一个程序集版本(它也应该是自动递增的),但当然你也可以手动更改它。如果您在第 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)属性。这样,您将能够从 eg 升级1.0.0.71.0.0.8. 而不仅仅是从1.0.7.01.0.8.0。如果您不这样做,您可能会在程序和功能中看到多个安装。

    <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>
于 2014-10-13T16:33:25.783 回答
39

我检查了上面提到的所有帖子,仍然花了很长时间试图让它发挥作用。

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

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

于 2010-01-05T13:12:06.380 回答
8

您需要使用升级表:

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

这是一个教程

于 2009-02-01T15:31:03.383 回答
3

我试过这个,它对我有用。

  1. 像这样放置您的产品标签:

    产品 ID="*" Name="Something" Language="1033" Version="1.0.0.0" Manufacturer="Someone" UpgradeCode="43ab28d7-6681-4a05-a6b5-f980733aeeed"

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

  1. 在您的 Package 元素中嵌套一个 MajorUpgrade 标记,如下所示:

    " MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="已安装较新版本的 [ProductName]。" AllowSameVersionUpgrades="yes" /

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

于 2017-04-20T07:03:24.187 回答
-3

只需将此元素放在元素下Product

<MajorUpgrade AllowDowngrades="yes" />

此 HowTo中的更多信息

于 2014-03-21T11:29:32.900 回答