在卸载期间提示用户关闭应用程序(在 WiX 中)

Posted

技术标签:

【中文标题】在卸载期间提示用户关闭应用程序(在 WiX 中)【英文标题】:Prompt user to close application during uninstall (in WiX) 【发布时间】:2010-10-17 04:11:48 【问题描述】:

我正在使用 Windows Installer XML 3.0 (WIX3) 安装一些软件。

一切正常,但是,我很难处理以下用例:当用户尝试卸载时,已安装的软件仍在运行 > 它。默认行为似乎删除了所有文件,但允许应用程序运行(在我的情况下很难看到,因为它位于任务托盘中)。

我在installer.wxs 文件中添加了以下代码:

<InstallExecuteSequence>
  <Custom Action="WixCloseApplications" Before="RemoveFiles" />
</InstallExecuteSequence>

<util:CloseApplication Id="CloseFoobar"
                       CloseMessage="no"
                       Description="FooBar is still running!"
                       ElevatedCloseMessage="no"
                       RebootPrompt="no"
                       Target="foobar.exe" />

但这不起作用 - 更糟糕的是,它会显示一个对话框,要求在安装期间重新启动!

正确的做法是什么?

【问题讨论】:

【参考方案1】:

据我所知,在您的 UI 中添加以下引用就足够了:

<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />

CloseApplication 的东西只用于在安装过程中关闭应用程序,但它有问题(至少当我几个月前尝试过时,现在可能已经修复了?)

不幸的是,这又是一个非常糟糕的 WiX 文档示例,甚至没有记录像这样的标准安装/卸载场景。

【讨论】:

感谢您的回答!我尝试过这种方式,但它对我不起作用。根据 MSDN,这两个对话框也仅在安装期间显示,在卸载期间不进行评估! 是的,CloseApps 可能需要加强处理所有这些情况。它还不能处理所有场景。 @RobMensching CloseApplication 现在更好了吗?【参考方案2】:

几天前在 wix-users 邮件列表上提出了一个类似的问题。那里给出的答案是:

这就是 Windows 的工作方式 预 Vista 和重新启动管理器。那里 必须是***窗口 可用的。托盘中的应用程序没有 数。

wix-users archive 中也有一些关于该主题的主题。

【讨论】:

【参考方案3】:

您能否检查卸载日志 (here is how to enable them),据我所知,Windows Installer 会将您的文件置于删除挂起状态并在最后要求重新启动。 您还可以编写一个简单的自定义操作来终止您的进程。

【讨论】:

【参考方案4】:

有关如何使用 closeapplication 的示例,请点击此链接: wix github project, unit tests

要显示提示对话框,您可以使用: <util:CloseApplication Id="CloseIE" Target="iexplore.exe" PromptToContinue="yes" Description="Test" />

【讨论】:

【参考方案5】:

Shay 的回答是正确的。最新版本的 Windows Installer 就是这样运行的。 Windows Installer 费了很大的力气来确保您可以通过重新映射正在使用的 Dll 等来避免在卸载时重新启动。通常,正在运行的应用程序可以在卸载后继续运行,并且在应用程序时会进行一些清理关机,下次重启后剩下的。关键是,如果 Windows Installer 可以将正在使用的二进制文件移动到另一个位置,保持任何应用程序运行,并替换正在使用的应用程序(但重新映射内存支持),那么所需要做的就是删除一些非必要的垃圾在下次重新启动时,为什么要强制重新启动?无需显示正在使用的文件对话框,因此不会出现这种情况。

如果应用尝试访问已卸载的文件,这可能会导致问题,但我认为风险很低。如果应用程序需要知道正在进行卸载,那么与重新启动管理器集成应该可以工作 - Windows 会告诉它正在进行卸载。否则,Shay 是正确的。如有必要,编写卸载自定义操作以告知应用关闭。

【讨论】:

【参考方案6】:

我也遇到过这个问题。 将 Before 属性更改为“InstallValidate”对我有用。

<Custom Before="InstallValidate" Action="WixCloseApplications"/>

【讨论】:

以上是关于在卸载期间提示用户关闭应用程序(在 WiX 中)的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义安装位置的 Wix 捆绑卸载包

WIX 自定义卸载操作失败

在使用 wix 卸载之前关闭系统托盘应用程序

如何在卸载时立即生成WIX执行命令

在 wix 安装期间搜索注册表更改

Wix:如何使用 FileInUse 对话框