我用Wix编写了一个安装程序,可以很好地安装我的程序。现在我需要更新它,所以我增加了版本号,但是当我在旧版本上安装新程序时,它抱怨说已经安装了旧版本,并告诉我先将其卸载。
如何在重新安装之前获取更新或自动卸载它?
Answers:
我觉得所提供的答案都不是完整的或独立的,因此在摸索了整个沼泽之后,我认为这是实现更新(完全不言而喻)要求所必需的步骤:
确保每次构建时您的产品ID都会更改。如果不这样做,您将始终收到OP提及的“已安装”消息。
<Product Id="*" ...>
每次产品本身更改时,请更改产品版本。我想最好的选择是将其绑定到程序集版本(也应自动递增),但是当然您也可以手动更改它。如果您在第4点使用AllowSameVersionUpgrades属性,则并非严格要求执行此步骤,但是我敢说,在任何情况下,保持产品版本恒定都是不好的做法。
<Product Version="!(bind.FileVersion.MyAssemblyDll)" ...>
<File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
保持您的UpgradeCode不变(例如):
<Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
添加MajorUpgrade元素(来自Wix 3.5.1315.0)。要避开MajorUpgrade会忽略产品版本的修订号更改的问题,请添加AllowSameVersionUpgrades(或者,如果您更喜欢AllowDowngrades)属性。这样,您将能够从升级1.0.0.7
到1.0.0.8
。而不仅仅是从1.0.7.0
到1.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>
<Product Version="1.0.0.0" ...>
。请再次阅读第2节,并查看wix变量。
*
适合我的情况。
我检查了上面提到的所有帖子,仍然花了很长时间尝试使它起作用。
步骤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>
另请注意,显然,仅使用版本号的前三个组件来检查升级...
$(var.property)
语法);wix.sourceforge.net/manual-wix2/preprocessor.htm
您需要使用升级表:
<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>
我尝试了这个,对我有用。
产品ID =“ =” Name =“ Something” Language =“ 1033” Version =“ 1.0.0.0” Manufacturer =“ Someone” UpgradeCode =“ 43ab28d7-6681-4a05-a6b5-f980733aeeed”
产品ID应该设置为*,以便每次构建项目时都使用不同的ID。
“ MajorUpgrade AllowDowngrades =”否“ DowngradeErrorMessage =”已经安装了[ProductName]的较新版本。AllowSameVersionUpgrades =“ yes” /
因此,每次更新版本(或版本相同,但不小于当前版本)时,它都会通过删除以前的文件并安装产品文件来重新安装产品。它不会降级您的产品。