C# 我可以将windows服务执行委托给其他进程吗?

C# 我可以将windows服务执行委托给其他进程吗?,c#,windows-services,C#,Windows Services,我希望能够启动Windows服务,启动另一个可执行文件,然后退出,让启动的可执行文件作为服务运行 这些流程将能够相互通信,因此任何一个流程所需的信息都可以从另一个流程获得 在.NET中可以这样做吗 编辑:为了澄清这一点,以下是工作流的外观: 服务启动,启动a.exe。注意:a.exe不调用ServiceBase.Run() a、 exe使用Process.Start()启动b.exe a、 exe和b.exe完成交换信息所需的任何通信,如进程或服务句柄(注意:此功能已存在) a、 exe将服务控

我希望能够启动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运行并绑定到服务控件
  • 看,(虽然老了,但应该还能用)

    如果您试图启动已注册的服务

    新进程运行后,与其通信的要求与任何其他进程间通信的要求相同


    您可以使用WCF、打开套接字、使用数据库等。如果没有关于所需通信类型的更多详细信息,则很难推荐特定的方法。

    不,您无法更改绑定到服务控制管理器的流程。要了解为什么这是不可能的,您需要了解非托管Windows服务API是如何工作的。(哪个.NET正在包装)

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

    StartServiceCtrlDispatcher
    的调用在所有服务停止之前也不会返回。因此,托管的服务控制还绑定到启动服务的进程中的线程,因此,如果不切断到服务管理器的链接,就无法退出


    因此,在您的示例中,步骤4无法执行,进程a.exe需要在整个过程中保持活动状态。

    如果服务进程退出,“这些进程将无法相互通信”。呃,如果服务退出,它们将如何通信?管理员应该如何停止并重新启动服务?它真的不再是一项服务,只是一个没有人可以控制的过程。步骤4和步骤5当然是难点,你无法做到这一点。服务控制器只知道它启动的服务。服务控制回调是特定于进程的。使用ServiceController类来控制b.exe,它也需要是一个服务。@DanielShaffer如果您能够设法将b.exe的进程ID传递回服务,您应该能够控制它。您可以考虑在A.EXE和B.EXE之间使用扩展的任何通信机制来允许B.EXE与服务进行对话。一种方法是打开它们之间的套接字连接。我已经在使用进程。开始启动第二个进程。IPC已经处理好了——我在问题中提到IPC只是为了表明它在需要时可用。我主要感兴趣的是将服务控件绑定到第二个进程而不是第一个进程。如果我创建了一个带有已启动进程句柄(而不是当前进程句柄)的服务\u TABLE\u条目,该怎么办?我意识到我基本上是在重新实现ServiceBase.Run(),但这似乎可以做到?不,SERVICE\u ENTRY\u表不包含进程的句柄-它总是使用当前进程。