我正在尝试升级我的应用程序。如果用户安装了1.0.0,那么下次我发布版本时我可以给它们1.1.0并且可以安装它。 Overwriting | removing | replacing the first version
只应在控制面板中安装一个版本 - >卸载或更改程序。
我的问题是:
如果我没有设置产品ID等于*(改为使用$(var.ProductId))我得
此产品的另一个版本已安装。安装 这个版本无法继续......
如果我将它设置为等于*则安装新版本并且我安装了两个版本。
我创建了一个简单的wix应用程序来测试它。
<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="!(bind.FileVersion.MyAssemblyDll)"?>
<?define UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be"?>
<?define ProductId="{6408D956-40DA-4AEE-883E-5425F1562004}"?>
<?define Version="1.2.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="$(var.ProductId)" Name="UpgradeTest" Language="1033" Version="$(var.Version)" Manufacturer="xxx" UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<!-- prevents down gradeing -->
<!-- one upgrade installes new version first then removes the old one. -->
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." Schedule="afterInstallExecute"/>
<MediaTemplate EmbedCab="yes"/>
<Feature Id="ProductFeature" Title="UpgradeTest" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="UpgradeTest" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<Component Id="ProductComponent">
<File Id="Product.wxs" Source="Product.wxs" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
我一直试图让这个工作好几天,现在我已经用尽了所有的教程,直到2008年。任何帮助将不胜感激。
更新:
<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." AllowSameVersionUpgrades="no" />
错误:控制面板中有两个版本的结果。
更新二:
<Upgrade Id ="$(var.ProductUpgradeCode)">
<UpgradeVersion Minimum="$(var.ProductFullVersion)" OnlyDetect="yes" Property="NEWERVERSIONDETECTED"/>
<UpgradeVersion Maximum="$(var.ProductFullVersion)" IncludeMaximum="no" Property="OLDERVERSIONBEINGUPGRADED"/>
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallValidate"/>
</InstallExecuteSequence>
<Condition Message="A newer version of [ProductName] is already installed. If you are sure you want to downgrade, remove the existing installation via Programs and Features.">Not NEWERVERSIONDETECTED</Condition>
错误:控制面板中有两个版本的结果。
答案 0 :(得分:1)
我执行该操作的方式是使用UpgradeCode
的GUID,但将产品的Id
保留在*
。
然后将重新安装属性设置为amus
,以便按您希望的方式重新安装产品。
它看起来像这样
<Product Id="*"
Name="YourProductName"
Language="1033"
Version="YourProductVersion"
Manufacturer="YourCompany"
UpgradeCode="{SOME-GUID}">
<SetProperty Id="REINSTALLMODE" Value="amus" After="FindRelatedProducts">Installed AND REMOVE<>"ALL"</SetProperty>
对于amus
,您可以参考Microsoft文档here,但要小心。使用a
值,即使已安装的应用程序具有较新版本,它也会重新安装您的应用程序。但是,您将找出安装程序所需的字符。
答案 1 :(得分:0)
尝试将<MajorUpgrade>
元素更改为此
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." AllowSameVersionUpgrades="yes" Schedule="afterInstallExecute"/>
当设置为no(默认值)时,MSI允许安装具有相同版本和升级代码(但产品代码不同)的产品,并将其视为两个产品。设置为yes时,WiX会设置msidbUpgradeAttributesVersionMaxInclusive属性,该属性告诉MSI将产品视为与主要升级版本相同的版本。
因此,它被视为您的两个安装无关。我认为这是一种奇怪的行为,但却怪微软。