针对已停止的Windows服务的C#ExecuteCommand

时间:2009-05-13 13:04:44

标签: c# windows-services

我正在开发一个应用程序,通过Windows服务在后台实现工作。 我已经通过MSDN教程创建了该服务,然后我可以正确启动或停止它。

我的服务还需要执行自定义命令。因此,我在服务的类中实现了“ OnCustomCommand ”方法。

我可以发送自定义执行命令,命令ID在128到255之间,因此我在网上找到了所有内容。

我的问题是: 当服务停止时,我无法对服务执行命令。每次我在ExecuteCommand()上调用System.InvalidOperationExceptionserviceController都会Cannot control <myservice> service on computer '.'

executeCommand

服务运行时不会发生这种情况。

MSDN说

  

当你调用ExecuteCommand时,   服务的状态不会改变。   如果服务已启动,则为状态   仍在运行。如果服务是   停了,状态仍然是Stopped,   等等。

所以我认为这对于已停止的服务实际上可以serviceController

我的服务作为LocalSystem服务安装,{{1}}以管理员权限运行。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

对于已停止的服务,ExecuteCommand是不可能的。我相信您正在阅读的文档告诉您的是,如果停止,调用ExecuteCommand将不会启动该服务。这并不是说您仍然可以调用该方法;基本上没有对象存在来执行该方法。我认为你最好的解决方案是找到一种方法来确定服务是否已经停止,如果有,重新启动它然后调用ExecuteCommand。否则,您可以使用某种“脏黑客”并尝试呼叫,如果失败,捕获异常并启动服务并再次尝试。绝不是首选,但可能。

编辑:

假设您使用ServiceController,可以使用Status属性来确定服务是否正在运行。

答案 1 :(得分:0)

针对已停止的服务无法执行ExecuteCommands。

如果它没有运行,那么它就不会“听到”你发送它的命令。