我正在使用WIX创建我的安装程序。我的旧应用程序已经安装在机器上,当我安装新版本的应用程序时,它会删除旧版本的所有文件和程序集,并放置新版本的文件和程序集,但在控制面板的程序和功能中显示旧版本和新版本。
我正在使用以下代码进行升级
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="$(var.ProductVersion)" IncludeMinimum="no" OnlyDetect="yes" Language="!(loc.lcid)" Property="NEWPRODUCTFOUND"/>
<UpgradeVersion Minimum="1.0.0.0" IncludeMinimum="yes" Maximum="$(var.ProductVersion)" IncludeMaximum="no" Language="!(loc.lcid)" Property="UPGRADEFOUND"/>
</Upgrade>
<CustomAction Id="PreventDowngrading" Error="!(loc.CustomAction_PreventDowngrading)"/>
<InstallUISequence>
<Custom Action="SetWindowsTypeProp" Before="FindRelatedProducts">1</Custom>
<!--Custom Action="SetPresenceProperties" After="SetWindowsTypeProp">1</Custom-->
<Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
<RemoveExistingProducts Before="InstallInitialize"/>
</InstallExecuteSequence>
请告诉我如何从程序和功能中删除条目
这意味着你的MajorUpgrade不能工作。FindRelatedProducts找不到旧版本,因此REmoveExistingProducts不起作用。对于最新版本的WiX,您可以删除大量此类代码,并用较新的MajorUpgrade元素替换。它是一个更高层次的抽象,简化了大部分的创作。
要想实现一次成功的MajorUpgrade,必须做到以下几点:
1)新旧MSI必须具有相同的UpgradeCode GUID。(虽然从技术上讲,MSI可以通过使用额外的UpgradeCode属性来删除不相关的产品,但出于本问题的目的,我们将忽略这一点。)
2)旧的和新的MSI必须有唯一的ProductCode guid。
3)新的MSI必须具有更高版本的ProductVersion属性。请注意,只计算前3个数字。(1.2.3 -> 1.2.4作品为1.2.3.4 -> 1.2.3.5不)
4)旧MSI和新MSI必须安装在相同的上下文中(Per User->Per User或Per Machine ->Per Machine)
5)升级表必须正确编写。可以使用MajorUpgrade元素来辅助。