【问题标题】:Prompt to uninstall older version of APP in WiXWiX中提示卸载旧版APP
【发布时间】:2013-07-31 16:28:27
【问题描述】:

我使用Wix 3.6 开发了一个安装程序,可以成功安装应用程序的所有元素。

现在,每次我给一个更高版本的msi,我希望安装程序提示用户卸载它。从现在开始我已经尝试过:

<Product 
Id="*" 
Name="!(loc.ProductName)" 
Language="3082" 
Codepage="1252"
Version="1.0.1"
Manufacturer="$(var.ProductManufacturer)" 
UpgradeCode="$(var.UpgradeCode)">

<Property Id="PREVIOUSVERSIONINSTALLED" Secure="yes" />
<Upgrade Id="$(var.UpgradeCode)">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="99.9.9.9" IncludeMiminum="yes" IncludeMaximum="no" Property="PREVIOUSVERSIONSINSTALLED" />
</Upgrade>

<InstallExecuteSequence>
  <RemoveExistingProducts Before="InstallInitialize" />
</InstallExecuteSequence>

此代码成功卸载了我计算机上任何以前安装的版本。但它不会询问用户是否确定这样做。

我需要的是 Wix 安装程序来提示用户说出如下消息:

已安装您的 [ProductName] 的早期版本。你想卸载它吗? [是的|没有 ] 选项。

有没有办法提示用户并检查他是否真的要卸载任何以前的版本?

【问题讨论】:

  • 如果用户点击“否”会发生什么?
  • WiX 甚至支持这样做吗?从个人经验来看,即使是微软自己的构建安装程序的软件也没有以正确的方式完成这样的事情而没有任何问题。

标签: wix wix3.6


【解决方案1】:

Windows Installer 升级表有一个名为 msidbUpgradeAttributesOnlyDetect 的属性位,由 WiX 的 UpgradeVersion@OnlyDetect 属性表示。

如果编写得当,这会导致 FindRelatedProducts 使用检测到的产品的 ProductCode GUID 设置您选择的操作属性。但它不会将此传递给 RemoveExistingProducts 以进行自动删除。

虽然不是典型的行为,但没有什么能阻止您编写一些在此属性具有值时触发的 UI。您可以询问用户是否要删除旧版本,如果是,请设置另一个操作属性来告诉 RemoveExistingProducts。 (提示:编写一个升级,它永远不会自己找到一个产品并劫持它的属性来注入删除。)

如果用户拒绝,您可以选择中止安装或继续并排安装到不同的目录结构。 (办公室、Visual Studio 等)。

【讨论】:

  • 谢谢克里斯托弗。我的第一个想法是将修复/更改/删除窗口替换为适合我需要的窗口(正如您评论的那样)。但我不知道为什么,当我安装应用程序并尝试安装新版本时,它会将我推送到面板控制中的添加/删除程序。对我来说,这个选择是最好的选择(创建自定义界面)。
  • 回到你的解决方案:你能解释一下如何使用你解释的解决方案吗?我迷失了如何应用它。
  • 对不起,我只能在 StackOverflow 上回答问题。无法提供培训。
  • 想想你所要求的支持范围,以及你甚至没有费心去投票或接受我的回答这一事实。我已经给了你想要的设计,你现在就去写吧。问候,克里斯
  • 不,因为对我来说,不是英语母语,这不是一个明确的答案。不过还是谢谢。因此,我会找到方法。
【解决方案2】:

我发现this post 在解决同样的问题时很有用。您可以使用您在 upgrade 标记中设置的 PREVIOUSVERSIONINSTALLED 属性来打开自定义对话框。通过添加以下代码(使用标准欢迎对话框时)在一些 UI 标记中执行此操作:

<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="OldVersionDlg">PREVIOUSVERSIONSINSTALLED</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="SetupTypeDlg">NOT Installed AND NOT PREVIOUSVERSIONSINSTALLED</Publish>

我基于this Wix tutorial 建立了我自己的自定义对话框,并最终得到以下代码:

 <Dialog Id="OldVersionDlg" Width="260" Height="85" Title="[ProductName] Setup" NoMinimize="yes">
        <Control Id="No" Type="PushButton" X="132" Y="57" Width="56" Height="17"
          Default="yes" Cancel="yes" Text="No">
          <Publish Event="EndDialog" Value="Exit">1</Publish>
        </Control>
        <Control Id="Yes" Type="PushButton" X="72" Y="57" Width="56" Height="17" Text="Yes">
          <Publish Event="EndDialog" Value="Return">1</Publish>
        </Control>
        <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30">
          <Text>A previous version of [ProductName] is currently installed. By continuing the installation this version will be uninstalled. Do you want to continue?</Text>
        </Control>
</Dialog>

【讨论】:

  • 能否请您提供有关您帖子中前两行代码的更多详细信息?对不起我的英语,但我不确定我明白该放在哪里:PREVIOUSVERSIONSINSTALLED
  • 前两行应该放在描述用户界面的文件中。我基于一个名为 WixUI_InstallDir.wxs 的示例,该示例可从 /src/ext/UiExtension/wxlib 下的wix.codeplex.com/downloads/get/762939 获得。这些行基本上描述了如果设置了 PREVIOUSVERSIONINSTALLED 会发生什么(在我的例子中,打开一个名为 OldVersionDlg 的自定义对话框)。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2014-06-03
  • 2013-10-21
  • 2014-12-11
  • 2013-02-17
  • 2011-08-19
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多