7

我正在使用 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" />

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

正确的方法是什么?

4

6 回答 6

7

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

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

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

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

于 2009-04-02T17:12:07.593 回答
1

几天前在 wix-users 邮件列表上也有人问过类似的问题。那里给出的答案是:

这是 Windows 在 Vista 和重新启动管理器之前的工作方式。必须有一个可用的顶级窗口。托盘中的应用程序不算数。

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

于 2009-04-02T22:39:26.853 回答
0

你能检查卸载日志吗(这里是如何启用它们),据我所知,Windows Installer 会将你的文件置于删除挂起状态并在最后要求重新启动。
您还可以编写一个简单的自定义操作来终止您的进程。

于 2009-04-03T06:39:44.547 回答
0

有关如何使用 closeapplication 的示例,请点击此链接:wix github 项目,单元测试

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

于 2015-03-31T08:26:04.780 回答
0

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

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

于 2015-05-20T17:18:22.837 回答
0

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

<Custom Before="InstallValidate" Action="WixCloseApplications"/>
于 2017-01-30T14:58:14.287 回答