在WIX中强制杀死Windows服务

我有Windows服务,将作为wix安装的一部分安装。 问题是,当前服务正在生产中,并且由于服务OnStop方法中的一些编写不良的代码而没有响应停止。

因此,下次用户尝试安装升级版本时,安装将失败,因为当wix尝试停止服务时,服务永远不会停止。

有没有什么方法可以让我知道如果wix花了太多时间来卸载,如果我收到通知我可以杀死进程?

另外,有什么方法可以根据产品版本杀死进程吗?

谢谢

我不应该回答这个问题,因为我处理过这样的事情已经很久了,但是到底是什么,让我们试试吧。

  1. CloseApplication Element :也许我会先尝试使用WiX的CloseApplication Element 。 我怀疑它是否可以用于服务,但这是我能想到的最方便的方法。
  2. Sysinternals PsKill :Mark Russinovich的PsKill值得一试。 我认为他的工具是可再发行的,因此您可以将它们包含在您的设置中,并且它们总是很好。 您必须从提升的延迟模式自定义操作调用它 – 这比使用内置的WiX构造更为复杂。
  3. Taskkill :还有内置的Taskkill – 我从未使用过。 建议使用sc工具 。

我想强调一点,我实际上没有测试这些工具来杀死服务,我现在没有时间这样做。 排序可能存在问题,因此可以在计划运行来自WiX的CloseApplication自定义操作之前安排StopServices 。 请在编译后使用Orca (朝向底部)检查InstallExecuteSequence以查看是否是这种情况。

我在挖掘一段时间后找到了解决方案。

我正在创建新的C#自定义操作项目,我在InstallInitialize之前对我的操作进行排序。

在我的C#自定义操作方法中,我使用FileVersionInfo.GetVersionInfo(filePath)读取现有的已安装文件版本;

然后我检查所需的版本,我想检查,如果条件匹配,我正在使用我的服务进程

  foreach (Process proc in Process.GetProcessesByName("ProcessName")) { proc.Kill(); session.Log("Service Killed"); } 

为了实现这一点,必须预先安装Wix工具集v3.11.1