2010-05-24 118 views
5

有沒有辦法將對象傳遞給Windows服務?我知道方法myServiceController.Star(string [] arg),但我需要傳遞比字符串數組更復雜的對象。 實際上,我不需要將對象作爲參數傳遞,我真正需要的是該服務可以使用在Windows窗體應用程序中創建的對象。我試過使用System.Web.Script.Serialization.JavaScriptSerializer.Serialize方法將對象轉換爲Json,但我不能,因爲該對象包含循環引用。我也嘗試使用指針 ,但我不能因爲它是一個託管類型的對象。將對象作爲參數傳遞給Windows服務

任何想法我能做什麼?

回答

3

而不是試圖傳遞對象itslef(由於服務在單獨的進程中執行而不起作用) - 傳遞一個exernal引用數據。例如,包含序列化對象的文件路徑。

我假設你的服務也在.NET中實現?如果是這樣,那麼使用二進制序列化(BinaryFormatter),因爲這將處理循環引用。然後,您可以通過從指定文件加載來反序列化您的服務。

您可能想要考慮如果用戶重新啓動服務會發生什麼情況 - 在那種情況下它從哪裏獲取數據?將不會有啓動參數。使用註冊表來存儲序列化對象的文件名可能會更健壯,並且在啓動時從此讀取您的服務。然後,即使在沒有啓動參數的情況下調用數據,也會始終查找數據,例如機器重新啓動或用戶重新啓動服務。

0

我使用數據庫來共享Windows服務和Windows應用程序之間的對象,使用XML作爲編碼格式並進行序列化我自己。使用數據庫,您可以將事務中的通信封裝在事務中(用於鎖定),爲日誌記錄添加額外字段,將該表視爲隊列,並且如果必須從崩潰重新啓動,則可以從中恢復。

0

這完全取決於Windows服務通過哪些通道進行通信。它可以作爲一個Web服務來監聽,運行專有的套接字/端口監聽器,或者(在.NET 4.0中)監聽內存映射文件或命名管道。

你的問題提到了一個(string [] args)方法,它看起來更像是一個命令行「main」方法。在這種情況下,如果這是一個Windows服務,你可能會看錯了。你不執行一個Windows服務EXE來傳遞它的參數....如果你希望它作爲一個服務來運行的話。

這些方法都涉及自己的怪癖。但基本上你必須通過參考或序列化來整理你的數據。

相關問題