2012-01-03 24 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

相關問題