【发布时间】:2012-01-03 17:31:11
【问题描述】:
我希望能够启动 Windows 服务,启动另一个可执行文件,然后退出,让启动的可执行文件作为服务代替自身运行。
进程将能够相互通信,因此任何一个进程所需的来自另一个进程的任何信息都是可用的。
这可以在 .NET 中实现吗?
编辑:为了澄清,这是工作流程的样子:
- 服务启动,启动 a.exe。注意:a.exe 不调用 ServiceBase.Run()
- a.exe 使用 Process.Start() 启动 b.exe
- a.exe 和 b.exe 完成交换信息所需的任何通信,例如进程或服务句柄(注意:此功能已经存在)
- a.exe 将服务控制权分配给 b.exe
- a.exe 退出,b.exe 继续运行并绑定到服务控件
【问题讨论】:
-
如果服务进程退出“进程将能够相互通信”是不可能的。
-
呃,如果服务退出,他们将如何通信?管理员应该如何停止和重新启动服务?它真的不再是一项服务,而是一个没有人能够控制的过程。
-
第 4 步和第 5 步当然是难点,你不能做到这一点。服务控制器只知道它启动的服务。服务控制回调是特定于进程的。使用ServiceController类来控制b.exe,它也需要是一个服务。
-
@DanielShaffer 如果您能够设法将 b.exe 的进程 ID 传递回服务,您应该能够控制它。您可以考虑扩展您用于在 a.exe 和 b.exe 之间进行通信的任何通信机制,以允许 b.exe 与服务通信。一种方法是在它们之间打开一个套接字连接。
标签: c# windows-services