WiX卸载程序:重新启动服务(如果存在)

时间:2009-12-03 18:36:38

标签: windows-services wix uninstall

我们的部分应用涉及向第三方产品注册插件。当第三方服务正在运行时,它已加载我们的DLL,因此磁盘上的文件被锁定。

因此,当我们卸载产品时,我们需要先停止第三方服务,然后在完成卸载后重新启动它。 (我们在安装时也会执行相同的停止/重启事项,因为如果这是升级,则会再次锁定现有文件。)

WiX有一个处理快乐路径的命令,没问题:

<ServiceControl Id="SomeUniqueId" Name="NameOfTheirService"
                Start="both" Stop="both"/>

即,在安装和卸载开始时停止服务,并在安装和卸载结束时重新启动它。到目前为止一切都很好。

如果最终用户首先卸载第三方应用,然后尝试卸载我们的应用,则会出现问题。我们的应用程序不适用于第三方服务,但如果用户想要同时卸载它们,则没有什么可以迫使他们按特定顺序执行此操作。但是,如果不再安装第三方服务,那么我们的卸载程序:

  1. 尝试停止第三方服务,因服务不再存在而失败,判断失败并不重要,然后继续。
  2. 卸载我们的产品。
  3. 尝试重新启动第三方服务,因服务不再存在而失败,确定 重要的失败,并显示错误对话框,说“服务'NameOfTheirService'(NameOfTheirService)失败开始。确认您有足够的权限来启动系统服务。“ (重试/取消)
  4. 如果用户点击“重试”,请转到3。
  5. 如果用户单击“取消”,则回滚并取消卸载。
  6. 换句话说,WiX的错误处理是错误的。停止服务应该是容错的,事实就是如此。在安装之后启动服务可能是不容忍的;没关系:如果服务无法启动,我的安装失败。但是,在 uninstall 之后启动服务应该是容错的,而不是。

    如果该服务不再存在,如何在卸载后重启服务而不会失败?

1 个答案:

答案 0 :(得分:0)

如果您将 Wait 属性添加到 SeviceControl 元素并将其设置为 no ,那么以及“重试”和“取消”您还将获得一个“忽略”按钮,用户可以单击该按钮继续安装/卸载而无需启动/停止服务。