我有Windows服务,它将作为Wix安装的一部分安装。问题是,当前服务正在生产中,由于服务中的一些代码编写不佳,它没有响应停止 OnStop 方法。
所以下次用户尝试安装升级版本时安装将失败,因为当Wix尝试停止服务时,服务将永远不会停止。
有什么方法可以让我知道Wix是否花费太多时间卸载,如果我收到该通知,我可以杀死该过程?
另外,有什么方法可以杀死基于产品版本的进程吗?
谢谢
经过一段时间的挖掘,我找到了解决方案.
我正在创建新的 C# 自定义操作项目,并在安装初始化之前对操作进行排序。
在我的 C# 自定义操作方法中,我正在使用 FileVersionInfo.GetVersionInfo(filePath);
然后我正在检查我想检查的所需版本,如果条件匹配,我将使用
foreach (Process proc in Process.GetProcessesByName("ProcessName"))
{
proc.Kill();
session.Log("Service Killed");
}
为了实现这一目标, Wix 工具集 v3.11.1 必须事先安装
也许试试这个:更新的答案。
我不应该回答这个问题,因为我已经很久没有处理过这样的事情了,但到底是什么,让我们试试。
CloseApplication Element- :也许我会先尝试WiX的CloseApplication Element。我怀疑它是否适用于服务,但这是我能想到的最方便的方法。
- SysinternalsPsKill:Mark Russinovich的PsKill值得一试。我认为他的工具是可再发行的,因此您可以将它们包含在您的设置中,而且它们总是很好。您必须从提升的延迟模式自定义操作中调用它 - 这始终比使用内置 WiX 构造更复杂。 Taskkill
- :还有内置的Taskkill——我从未使用过。建议与 sc 工具一起使用。
我想强调的是,我还没有真正测试过这些用于杀戮服务的工具,我现在也没有时间这样做。排序可能存在问题,可以在 WiX 的CloseApplication
自定义操作计划运行之前安排StopServices
。编译后请使用逆戟鲸(朝底部)检查InstallExecuteSequence
,看看是否是这种情况。