2009-12-30 33 views
5

我已經使用c#2005.創建並啓動了Windows服務Service1(以exe作爲MyService.exe)。 我已經包含一個方法GetMyRandomNumber(),它返回一個隨機double值。如何從運行Windows服務調用方法

這裏的問題是如何使用這個正在運行的服務,我怎樣才能調用該方法。

我曾嘗試加入MyService.exe的參考和訪問方法 -

Service1 s = new Service1(); 
MessageBox.Show(s.GetMyRandomNumber().ToString()); 

但發現該方法不從服務的運行實例叫即即使我停止服務的聲明被執行。

有人能解釋我怎樣才能從運行該服務的實例調用方法。

感謝您分享寶貴的時間。

回答

14

在代碼中,你實際上並沒有調用服務,而不是您正在引用可執行文件和invok從該程序集中創建一個方法(在運行時,.NET Framework將使用本地程序集來執行代碼,而不是您正在運行的服務)。

要做你想做的事,你有很多選擇。

在.NET 2.0中,您將使用.NET Remoting。您創建了遠程處理接口,其他程序集可以使用這些接口來跨可執行文件調用方法。

在.NET 3.0中,遠程處理已由WCF取代。您的服務將成爲一個WCF服務,它將公開GetRandomNumber()作爲其數據合同的一部分。應用程序可以使用合同並連接到您的服務來調用該方法。

對於.NET Remoting或其替代品Windows Communication Foundation,Web上有許多優秀的教程。

+2

如果在.NET 3.0+上,WCF將是這種情況下的正確選擇。爲了完整起見,我想補充一點,儘管WCF幾乎在所有情況下都替換了Remoting,但它仍然具有跨AppDomain通信的優勢 - 我不會使用WCF通過AppDomain邊界進行通信,但在其他所有情況下,WCF都是正確的選擇。 – 2009-12-30 08:49:42

2

與正在運行的服務進行通信與在任何其他正在運行的進程上調用方法沒有區別。這意味着您需要挖掘標準工具以進行流程間通信。

Windows Communication Foundation(WCF)將是我的默認選擇。您可以在Windows服務中託管WCF服務,並通過命名管道端點將其公開,以實現有效通信。

2

WCF將在同一臺計算機上進行通訊的矯枉過正。 Pipes是一個更簡單,更有效的解決方案。

+1

WCF可以使用命名管道。 http://msdn.microsoft.com/en-us/library/ms733769.aspx – 2009-12-30 08:18:49

+2

他正在使用C#2005(.Net 2.0?),因此WCF不是一個選項。 – Giorgi 2009-12-30 08:23:46

+1

良好的觀察。我沒有注意到這一點。 – 2009-12-30 08:31:23