2015-03-31 94 views
0

我有一個c#(.net 4)的小型服務,主要檢測會話更改,如計算機鎖定和解鎖並報告到後端SQL 2014 Express服務器。Windows服務Systray應用程序

我想添加一個系統托盤應用程序,它將與服務/後端進行交互以捕獲更多數據並與登錄用戶進行一些交互。

任何人都可以指向我的方向儘可能的教程或應用程序/服務創建和通信的概述?這是一個WCF的東西?應用程序和服務應該在同一個項目中嗎?

感謝您的洞察!

+0

您應該接受一個答案 – 2016-03-28 22:55:06

+0

可能的重複[如何顯示C#窗口服務的系統托盤圖標?](http://stackoverflow.com/questions/2652254/how-can-i-display-a -system-tray-icon-for-c-sharp-window-service) – 2016-03-28 22:56:00

回答

1

您可以將兩個項目放在同一個解決方案中。有很多選項可以與您的服務進行交互。最好的選擇取決於您希望UI應用程序使用該服務執行的操作。

我的選擇是使用託管在您的Windows服務應用程序中的WCF服務。有很多自託管WCF服務的例子(其中一個是here,雖然我沒有看完)。

請注意#1:要將服務引用添加到客戶端,您需要在Visual Studio外啓動主機,以防兩個項目處於相同的解決方案中,因爲「添加服務引用」菜單項不會在Visual Studio中運行時可用。

請注意#2:在Environment.UserInteractive == true時,創建您的Windows服務作爲GUI應用程序運行可能是個好主意。爲此,我傾向於修改Main方法以啓動服務,或者使用創建Windows Forms應用程序時發現的代碼(Application.Run(new SomeForm())等)啓動GUI。這使得調試lot更容易。


爲了避免混淆:我談論的是創建一個用戶交互的服務!我正在討論如何製作服務應用程序,以便它既可以作爲服務運行,也可以作爲應用程序進行調試。與此類似,例如:

static void Main(string[] args) 
{ 
    if (Environment.UserInteractive) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new DebugForm(new MyService())); 
    } 
    else 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new MyService() }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 

添加新的方法DoStart()DoStop()到您的服務類,只需要調用OnStartOnStop模擬正在啓動該服務。從窗體的處理程序中調用DoStart,並從窗體的OnClose處理程序中調用DoStop

當然,您需要添加System.Windows.FormsSystem.Drawing引用您的項目以允許使用表單。

通過這種方式,您可以直接在Visual Studio中運行服務應用程序,而無需「服務無法作爲應用程序運行」消息。

您仍然需要創建一個UI應用程序來與服務交互!以上內容僅對調試服務有所幫助,並且是我愛上的東西,因爲它使開發更容易!

+1

嗨Thorsten,感謝您的信息。我想要應用程序部分的原因是因爲從我讀過的所有內容來看,用戶交互式服務是一個不錯的選擇,並且從Windows Vista/7開始不再支持。 – FLAdmin 2015-03-31 12:43:17

+0

您好Thorsten,感謝您的信息。我想要應用程序部分的原因是因爲從我讀過的所有內容來看,用戶交互的服務是一個不錯的選擇,以及從Windows Vista/7開始不再支持。 – FLAdmin 2015-03-31 12:43:19

+0

哦!用戶交互式服務*不再可能*。你誤會我了!我的意思是:如果'Environment.UserInteractive == false'修改你的服務program.cs,以便它作爲一個服務運行,並啓動一個正常的應用程序**僅僅用於調試**如果'Environment.UserInteactive == true'!這與運行用戶交互的服務無關! – 2015-03-31 12:45:15

1

如果您只需要與服務進行基本交互(啓動/停止/重新啓動/狀態...),則ServiceController將爲您提供足夠的實用程序。

什麼比這更需要一個更復雜的方法,通常使用IPC,寫入同一個數據庫和/或回調到Web應用程序...

沒有必要有服務和Windows客戶端在同一個項目中。不過,您可以在一個地方定義您的服務名稱,因爲您的系統托盤應用程序需要服務名稱才能與您的服務進行交互。

把這兩個項目放在一起或不是你的電話,但要記住你的應用程序和你的服務之間的關係。沒有服務,您的應用程序可以獨立運行嗎如果有人更新服務而不意識到他們還需要更新另一個項目中的另一個應用程序,那就不太好了。