Major upgrades with WiX
I thought I was going crazy.. I’d built an installer using WiX and set the product version to 1.0.0.1. The plan was that installing a new version would automatically uninstall any old versions.
I then updated the version to 1.0.0.2 and installed the new version, only to end up with two installations.
Turns out that Windows Installer only looks at the first 3 digits of the ProductVersion (as the first Note mentions in the Windows Installer documentation on Major Upgrades) – so twiddling that 4th digit is not going to have any effect.
Here’s a sample .wxs file that works for me:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns\="http://schemas.microsoft.com/wix/2006/wi" xmlns:util\="http://schemas.microsoft.com/wix/UtilExtension"\>
<?define version = "1.1.3.11" ?>
<Product Id\="\*" Name\="WixUpgrading $(var.version)" Language\="1033" Version\="$(var.version)" Manufacturer\="WixUpgrading"
UpgradeCode\="630aaa2d-a583-46db-85c4-eaf237590c61"\>
<Package InstallerVersion\="200" Compressed\="yes" />
<Media Id\="1" Cabinet\="WixUpgrading.cab" EmbedCab\="yes" />
<Directory Id\="TARGETDIR" Name\="SourceDir"\>
<Directory Id\="ProgramFilesFolder"\>
<Directory Id\="INSTALLLOCATION" Name\="WixUpgrading"\>
<Component Id\="ProductComponent" Guid\="c768bc29-e2d6-4f1c-b711-2dcf91641fab"\>
<File Id\="TextFile1.txt" Name\="TextFile1.txt" KeyPath\="yes" Source\="TextFile1.txt" />
</Component\>
</Directory\>
</Directory\>
</Directory\>
<Feature Id\="ProductFeature" Title\="WixUpgrading" Level\="1"\>
<ComponentRef Id\="ProductComponent" />
</Feature\>
<Property Id\="PREVIOUSVERSIONSINSTALLED" Secure\="yes" />
<Property Id\="ALLUSERS" Value\="1" />
<Upgrade Id\="630aaa2d-a583-46db-85c4-eaf237590c61"\>
<UpgradeVersion Property\='PREVIOUSVERSIONSINSTALLED' OnlyDetect\="no" IncludeMinimum\='yes' Minimum\='0.0.0' IncludeMaximum\='no' Maximum\='$(var.version)' />
<UpgradeVersion Minimum\="$(var.version)" IncludeMinimum\="no" OnlyDetect\="yes" Language\="1033" Property\="NEWERPRODUCTFOUND" />
</Upgrade\>
<InstallExecuteSequence\>
<Custom Action\="PreventDowngrading" After\="FindRelatedProducts"\>NEWERPRODUCTFOUND AND NOT Installed</Custom\>
<RemoveExistingProducts Before\='InstallInitialize' />
</InstallExecuteSequence\>
<CustomAction Id\="PreventDowngrading" Error\="Newer version already installed." />
<CustomAction Id\="UIandAdvertised" Error\="Something about the UI."/>
<InstallUISequence\>
<Custom Action\="UIandAdvertised" Sequence\="3"\>ProductState=1</Custom\>
</InstallUISequence\>
</Product\>
</Wix\>
Categories: Software