2012-01-03 55 views
0

我希望能够启动Windows服务,启动另一个可执行文件,然后退出,将启动的可执行文件作为服务运行而不是自己。我可以委托Windows服务执行到另一个进程吗?

这些进程将能够相互通信,因此任何其他进程的进程所需的任何信息都可用。

这是可能在.NET中做?

编辑:为了澄清,这里的工作流程是什么样子:

  1. 服务启动,启动A.EXE。注:A.EXE不调用ServiceBase.Run()
  2. a.exe的启动B.EXE使用的Process.Start()
  3. A.EXE和B.EXE完成交换信息所需的任何信息,例如作为工艺或服务处理(注:该功能已经存在)
  4. A.EXE分配服务控制到B.EXE
  5. A.EXE退出,留下B.EXE运行并绑定到服务控制
+0

如果服务进程退出*“进程将能够相互通信”*是不可能的。 – Yuck 2012-01-03 17:34:26

+1

呃,如果服务退出,他们将如何沟通?管理员应该如何停止并重新启动服务?这实际上不再是一项服务,只是一个没有人控制的过程。 – 2012-01-03 17:36:47

+0

@Yuck看到我的编辑。 – 2012-01-03 18:06:59

回答

1

不,您不能更改绑定到服务控制管理器的进程。要明白为什么这是不可能的,你需要看看非托管Windows服务API的工作原理。 (.NET正在包装)。

您通过调用StartServiceCtrlDispatcher(只能调用一次)连接到服务控制管理器。在lpServiceTable参数中,您传递一个指向ServiceMain函数的指针,该指针显然只对当前进程有效,并且所有服务控制通知都会发送到此函数。

在所有服务都停止前,StartServiceCtrlDispatcher的呼叫也不会返回。因此,托管的服务控制也与启动服务的进程中的线程绑定,因此,如果没有与服务管理器断开连接,则无法退出。

因此,在您的示例中,步骤4不会发生,并且进程a.exe需要在整个持续时间内保持活动状态。

+0

如果我使用启动的进程的句柄而不是当前的进程创建了SERVICE_TABLE_ENTRY,该怎么办?我意识到我基本上会重新实现ServiceBase.Run(),但似乎可以做到这一点? – 2012-01-03 19:29:13

+0

不,SERVICE_ENTRY_TABLE不包含进程的句柄 - 它总是使用当前进程。 – shf301 2012-01-03 19:31:57

0

Process.Start()this tutorial(老了,但应该仍然工作),or this one

如果您正在尝试启动已注册的服务,请拨打this may help

一旦新进程运行,与它的通信与任何其他进程间通信secnario具有相同的要求。

你可以使用WCF,打开一个套接字,使用数据库等。没有关于你需要什么类型的通信的更多细节,很难推荐一种特定的方法。

+0

我已经使用Process.Start来启动第二个过程。 IPC已经得到照顾 - 我只在问题中提到表明如果需要,它可用。我主要感兴趣的是将服务控制绑定到第二个进程而不是第一个进程。 – 2012-01-03 18:14:17

相关问题