如何获取Wix更新程序的先前安装版本 [英] How to get Wix to update a previously installed version of a program

查看:70
本文介绍了如何获取Wix更新程序的先前安装版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I wrote an install program with Wix and it worked fine to install my program. Now I need to update it, so I bumped up the version number but when I go to install the new program over the old one it complains that an older version is already installed and tells me to uninstall it first.

如何在重新安装之前获取更新或自动将其卸载?

How do I get it to update or automatically uninstall it before reinstalling?

推荐答案

我觉得所提供的答案都不完整或不完整,因此在摸索沼泽之前,我认为以下是必须采取的步骤更新的(完全不言而喻的)要求:

I feel that none of the provided answers are complete or self-contained, so after digging my way through this swamp, here's the steps I think are necessary to get the (utterly self-evident) requirement of an update to work:

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

  1. Make sure your Product Id changes every time you build. If you don't, you'll always get the "already installed" message the OP mentioned.

<Product Id="*" ...>

  • 每次产品本身更改时都更改产品版本.我想最好的选择是将其绑定到程序集版本(也应自动递增),但是当然您也可以手动更改它.如果您在第4点使用AllowSameVersionUpgrades属性,则并非严格要求执行此步骤,但是我敢说,在任何情况下,保持产品版本恒定都是不好的做法.

  • Change the Product Version every time the product itself changes. I suppose the best option is to bind it to an assembly version (which should be auto-incremented as well), but of course you could also just change it manually. This step is not strictly required if you use the AllowSameVersionUpgrades attribute in point 4, but I'd venture to say that keeping your product version constant is bad practise in any case.

    <Product Version="!(bind.FileVersion.MyAssemblyDll)" ...>
    <File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
    

  • 保留您的UpgradeCode常数(例如):

  • Keep your UpgradeCode constant (e.g.):

    <Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
    

  • 添加MajorUpgrade元素(来自Wix 3.5.1315.0).要避开MajorUpgrade会忽略产品版本的修订号更改的问题,请添加AllowSameVersionUpgrades(或者,如果您更喜欢AllowDowngrades)属性.这样,您将可以从1.0.0.71.0.0.8.而不仅仅是从1.0.7.01.0.8.0.如果不这样做,可能会在程序和功能"中看到多个安装.

  • Add the MajorUpgrade element (from Wix 3.5.1315.0). To circumnavigate the catch that the MajorUpgrade will disregard changes in the revision number of the product version, add the AllowSameVersionUpgrades (or if you prefer AllowDowngrades) attribute. This way, you will be able to upgrade from e.g. 1.0.0.7 to 1.0.0.8. and not just from 1.0.7.0 to 1.0.8.0. If you don't do this, you may see multiple installations in Programs and Features.

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

  • 这是我的整个.wix文件(相关的部分,通向产品绑定的程序集的两个片段大部分是可选的,为了便于说明,您可以通过任何方式持有该程序集):

    Here's my whole .wix file (relevant parts, the two fragments that lead to the assembly which is used for product binding are mostly optional and for illustration, any way you can get a hold of the assembly will work):

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

    这篇关于如何获取Wix更新程序的先前安装版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆