未设置 WiX 卸载 UI 属性

Posted

技术标签:

【中文标题】未设置 WiX 卸载 UI 属性【英文标题】:WiX uninstall UI property not set 【发布时间】:2011-01-26 16:58:05 【问题描述】:

我正在尝试通过卸载时使用的 WiX UI 设置属性。我在安装时已成功完成此操作。阻止我获取 set 属性的顺序是否存在差异?似乎我的属性 REMOVEDATABASES 从未设置过。或者也许我需要发布它?这是一些代码sn-ps。任何帮助表示赞赏。

我的财产:

<Property Id="REMOVEDATABASES" Value="0" />

我如何进入允许用户设置属性的对话框:

<UI Id="WixUI_App">
  ...
  <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed</Publish>

  <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>

  <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
  <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="SetConfigurationUnInstallDlg">1</Publish>
  <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
   ...
</UI>

我使用该属性的对话框:

   <Dialog Id="SetConfigurationUnInstallDlg" Width="370" Height="270" Title="Uninstall option">
    <Control Id="NextUninstall" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)"  >
      <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
    </Control>
    <Control Id="BackUninstall" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" >
      <Publish Event="SpawnDialog" Value="MaintenanceTypeDlg">1</Publish>
    </Control>
    <Control Id="CancelUninstall" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
      <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
    </Control>

     ....

    <Control Id="UnistallDBLabel" Type="Text" X="20" Y="60" Width="80" Height="14" NoPrefix="yes" Text="Unistall Database?" />
    <Control Id="RadioButtonGroupID" Type="RadioButtonGroup" X="20" Y="58" Width="305" Height="100" Property="REMOVEDATABASES" Text="Remove Databases?" Default="no">
      <RadioButtonGroup Property="REMOVEDATABASES">
        <RadioButton Value="0" X="100" Y="0" Width="200" Height="10" Text="No" />
        <RadioButton Value="1" X="100" Y="20" Width="200" Height="10" Text="Yes" />
      </RadioButtonGroup>
    </Control>
  </Dialog>

最后,我尝试使用该属性的代码:

      <Component Id="cmpDatabaseUnInstall" Guid="B6D21CE5-9470-4D78-8760-E9AE04A91AB4"  KeyPath="yes">
    <Condition>REMOVEDATABASES = "1"</Condition>
    <sql:SqlDatabase Id="masterDB" Server="[SERVER]" Instance="[INSTANCE_NAME]" Database="master"
                   CreateOnInstall="no" ConfirmOverwrite="yes" DropOnUninstall="no" ContinueOnError="no"
                   CreateOnReinstall="no" CreateOnUninstall="no" DropOnInstall="no" DropOnReinstall="no">
    </sql:SqlDatabase>
    <sql:SqlScript Id="DropAllDatabases"
                   SqlDb="masterDB" BinaryKey="DropAllDatabases"
                   ContinueOnError="yes" ExecuteOnInstall="no" ExecuteOnReinstall="no" ExecuteOnUninstall="yes"
                   Sequence="1"/>
  </Component>

谢谢, 斯科特

【问题讨论】:

仅供参考,我将您的帐户合并在一起。 【参考方案1】:

在安装期间更改的属性和表不会保留。您可能想要执行以下操作:

The WiX toolset's "Remember Property" pattern

【讨论】:

顺便说一句,在卸载期间执行 SQL 脚本要非常小心。确保如果它们失败,您仍然可以卸载而不是被阻止。 我了解安装之间不会保留属性。我也了解如何将它们保存到注册表中。但是,这不是我在这里所做的。我在卸载过程提示用户卸载问题。我正在与无线电集团一起做这件事。无线电组正在使用公共属性 REMOVEDATABASES。后来,在同一次卸载中,我尝试使用该属性来决定是否运行脚本。但是,似乎从未设置公共属性。知道为什么吗?我在安装过程中做了类似的事情(即询问数据库服务器名称和 inst MSI 在通过添加/删除程序卸载期间不支持 UI。除了最初的是/否确认之外,删除永远不会有 UI。获得某种 UI 的唯一方法是禁用 Remove 并仅启用 Change。然后当他们选择删除时提示您的问题并继续前进。 还要确保当您获取属性并在 UI 中提示它们时,您具有写入调度和条件,这样您的两个输入就不会相互影响。 不幸的是,链接已失效。如果博客文章在其他 URL 下可用,则将其添加到此处或更新答案会很有用。【参考方案2】:

您的财产是否标记为Secure(即在SecureCustomProperties 中列出)?如果不是,它的值可能不会进入执行序列。在日志中搜索 Ignoring disallowed property 之类的内容应该可以确认或否认这一点。

【讨论】:

以上是关于未设置 WiX 卸载 UI 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WiX 和 MSI 进行静默安装和卸载?

如何获取用户在安装 WIX 设置时输入的属性值?

如何防止 wix 自定义引导程序卸载 UI 在升级过程中显示

WIX安装项目未完全卸载应用程序

卸载升级时如何摆脱wix中未使用的dll

WIX的卸载条件