Ответ 1
Я чувствую, что ни один из предоставленных ответов не является полным или самодостаточным, поэтому, пройдя путь через это болото, здесь шаги, которые я считаю необходимыми, чтобы получить (совершенно очевидное) требование обновления для работы:
-
Убедитесь, что ваш идентификатор продукта изменяется каждый раз, когда вы строите. Если вы этого не сделаете, вы всегда получите сообщение "уже установлено", о котором упомянул OP.
<Product Id="*" ...>
-
Измените версию продукта каждый раз, когда сам продукт изменится. Я полагаю, что лучшим вариантом является привязка его к версии сборки (которая также должна быть автоматически добавлена), но, конечно, вы также можете просто изменить ее вручную. Этот шаг не является строго обязательным, если вы используете атрибут AllowSameVersionUpgrades в пункте 4, но я бы рискнул сказать, что сохранение постоянной версии продукта - это плохая практика в любом случае.
<Product Version="!(bind.FileVersion.MyAssemblyDll)" ...> <File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
-
Сохраняйте постоянную константу обновления (например):
<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 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>