2010-10-05 35 views
1

我試圖啓動一個正在運行的C#程序,然後在它開始運行後從cmd.exe提供命令。例如,假設我從命令行啓動了我的.exe(C://FILEPATH/my_program.exe)。然後,我想讓該程序繼續運行,然後讓我能夠傳遞命令來處理它。在我的理想世界中,這將會像「C://FILEPATH/my_program.exe run_my_command()」那樣執行run_my_command函數,或者「C://FILEPATH/my_program.exe k」,它會做出響應到我已預編程的字符。我知道,因爲我輸入了,會啓動一個my_program.exe的新副本。我只想有一個運行,而我通過類似的東西。來自命令行的C#程序參數?

有誰知道如何做到這一點?示例代碼將非常感謝。謝謝!!

+0

爲什麼你不希望它作爲GUI應用程序(因爲你希望它是交互式的)或傳統的客戶端 - 服務器應用程序(連接到服務器,發送命令,斷開連接)? – Gishu 2010-10-05 04:55:20

+0

我在網上啓用一些東西。我正在使用PHP中的System()寫入命令行。 – Ethan 2010-10-05 05:03:14

回答

3

最簡單的解決方案是讓您的第二個「my_program.exe」實例查找已經運行的現有實例,將消息「傳遞」給它,然後立即退出。

這種實現的常用方法是通過命名管道(.NET中的System.IO.Pipes)。當你的程序啓動時,用一個給定的名字監聽一個命名管道。如果還有其他內容正在該管道上偵聽,請發送消息並退出。

+0

+1,除了我建議遠程處理或WCF而不是命名管道作爲進程間通信方法。 – Justin 2010-10-05 05:06:54

+0

@Kragen:爲了什麼? Overpower imo – abatishchev 2010-10-05 05:57:18

+0

@abatishchev - 命名管道是一個低級別的機制 - 負責定義協議,處理錯誤以及解決任何安全問題。 .Net Remoting/WCF是提供上述所有內容的命名管道(以及其他傳輸機制)的包裝器 - 爲什麼在已經存在的情況下努力根據命名管道編寫自己的IPC機制? – Justin 2010-10-05 06:29:04

1

您正在描述一個典型的服務和命令工具。服務(惡魔)在後臺運行並執行命令。命令工具接受用戶命令並將它們傳遞給服務。見Windows Service Applications。使用服務而不是啓動多個進程來處理您的方法所具有的一些問題,如進程間的安全隔離(例如,一個用戶啓動一個命令,另一個用戶啓動另一個命令並在第一個用戶的環境中執行)以及進程生命期問題(用戶啓動一個命令,然後關閉他的會話)。

命令工具將通過經典IPC(本地RPC,管道,共享內存等)與進程進行通信。