首页 > 解决方案 > WiX:如何立即重启 explorer.exe?

问题描述

我是软件打包的初学者。我正在使用 cpack + Wix。我试图找到有用的信息或关于util:RestartResource的好文档,但找不到我的问题的任何 awnser。

问题: 我必须安装一个 ShellExtension,它需要在设置一些注册表值后重新启动 explorer.exe。因此,我使用命令(https://wixtoolset.org/documentation/manual/v3/xsd/util/restartresource.html):

<util:RestartResource ProcessName="explorer.exe"/>

一切几乎都像预期的那样工作。Explorer.exe 将按预期被杀死,但在用户完成安装后将触发 explorer.exe 的重新启动。这是令人不快的,因为 explorer.exe 会消失,直到用户单击安装的完成按钮。我想在设置注册表值后直接重新启动资源管理器。我知道这应该是可能的,因为如果 WiX 自己触发了 explorer.exe 的重启,它会立即执行,不会等到安装完成。诀窍是什么?我已经尝试过 CustomActions 并将util:RestartResource放在 WiX-Code 的不同位置(我很绝望。)。

[编辑]我正在分析安装日志。我意识到默认情况下,在进度开始时会调用一个重启管理器,并在最终对话框之前关闭自己。如果我将 ProcessName 添加到 RestartResource 它会打开另一个重新启动管理器,该管理器在最终对话框后关闭自己。需要了解如何像默认的 RestartResource 一样调用 RestartResource

[EDIT2]我猜util:RestartResource是错误的。目前,我抓取了 WiX 实现代码和 MSI 文档,通常您应该在状态“InstallValidate”之前注册所有 RestartResources。这正是 WiX 在UtilExtension_Platform.wxi中试图做的事情:

  <Fragment>
    <CustomAction Id="WixRegisterRestartResources$(var.Suffix)" BinaryKey="WixCA" DllEntry="WixRegisterRestartResources$(var.Suffix)" Execute="immediate" Return="check" SuppressModularization="yes" />

    <InstallExecuteSequence>
      <Custom Action="WixRegisterRestartResources$(var.Suffix)" Before="InstallValidate" Overridable="yes" />
    </InstallExecuteSequence>
  </Fragment>

因为在这个状态之后 MsiRestartManagerSessionKey 会被终止。在注册RestartResource的情况下,WiX 会尝试使用此密钥。但是我在日志中看到的是,我的util:RestartResource调用将始终在“InstallValidate”状态之后执行。并且日志此时已经表明,MsiRestartManagerSessionKey 已提前终止(在“InstallValidate”状态之后)。从我的角度来看,这是反对 MSI 政策的。

[EDIT3] 这不是错误的。我会发布一个遮阳篷。

标签: wixwix3wix3.10wix3.11wix3.9

解决方案


“重新启动资源管理器”的一种方法是重新启动系统。您可以为此使用 Forcereboot 元素。

在安装过程中提示用户重新启动系统。特殊动作没有内置序列号,因此必须相对于另一个动作出现。建议的方法是使用 Before 或 After 属性。InstallExecute 和 InstallExecuteAgain 可以选择出现在 InstallInitialize 和 InstallFinalize 之间的任何位置。

更多细节可以在这里找到:https ://wixtoolset.org/documentation/manual/v3/xsd/wix/forcereboot.html

另外:强制您不拥有的 Windows 进程重新启动似乎很危险。WiX 本身可能不支持它,因为您可能不应该这样做。:)


推荐阅读