2014-03-25 35 views
0

我一直在MSDN上閱讀有關Windows服務的一些樂趣,但我在抓取一些信息時遇到了一些麻煩。如何正確編程一個Windows服務?

我創建了以下在this msdn page步驟一個窗口服務,我注意到他們ommitted是自動生成的部分之一(即,Program.cs中主要的部分)開始服務的集合。我無法理解服務如何實際運行,或者更正確地說,我如何正確編程服務來執行我想要的操作。自動生成的service.cs只有一個構造函數,一個OnStart和OnStop事件方法。我應該在OnStart方法上編寫大量代碼嗎,還是有類似的Main部分用於服務?

我的另一個問題是關於服務的部署。在我提到的頁面中,他們引用了另一個讓我在VS開發人員控制檯上使用installutil的頁面。如果目標平臺沒有開發人員控制檯,我該如何爲服務創建自動安裝程序?

回答

1

如何在目標平臺沒有開發人員控制檯的情況下爲服務創建自動安裝程序?

您必須添加一個System.Configuration.Install.Installer才能在遠程計算機上安裝服務。如果目標機器沒有可用的開發者控制檯,這應該甚至可以工作。

我無法理解如何將服務實際運行,或 更正確,我如何正確節目的服務做我 想要什麼。

這實際上比您最初想象的要簡單得多。如果您的服務是正常流程,您的服務將運行相同。如果您有一個控制檯應用程序可以打開一個端口並監聽流量,那麼當您將其轉換爲服務時,它仍然可以以相同的方式工作。

但是,變化是什麼,你的服務是如何開始的。你已經正確安裝服務後,您可以像這樣啓動它:

[MTAThread] 
    static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new YourServerClass() 
     }; 
     ServiceBase.Run(ServicesToRun); 
    } 

YourServerClass要繼承ServiceBase,這將允許您使用OnStartOnStop方法。在這些方法中,您可以指定服務如何啓動,以及在服務停止時應該做什麼(在清理等方面)。

如果一切順利,並且在項目中有安裝程序和實際服務,那麼您應該能夠在install it as a service through the use of PowerShell之後啓動,停止並從服務窗口重新啓動它,就像使用其他服務一樣服務。

+0

所以OnStart方法將被ServiceBase.Run()調用...在這種情況下,我可以使用OnStart來執行YourServerClass操作,對吧?我只是對程序應該如何運行感到困惑,因爲你還提到OnStart應該「指定服務是如何啓動的」,並且我知道這些約定會使代碼更容易理解。 –

+0

是的,在我剛剛做的一個實現中,我從'OnStart'方法啓動我的WCF服務,並在'OnStop'中關閉它。我的意思是指定服務如何啓動,服務將提供的實際功能是如何啓動的,在我的情況下是WCF服務。 – aevitas

2

服務不過是一個(大部分時間)控制檯程序。所以,是的,OnStart方法是您的服務的入口點,就像Main方法一樣。如果您的服務必須定期執行,您必須管理循環部分。每當用戶手動停止服務或系統執行時,都會調用OnStop方法。 在Main Program方法中啓動ServiceBase數組的原因是可以有多個服務類並行啓動它們。 您必須知道,Main方法的內容只能由系統在已安裝服務的上下文中執行。你不能這樣調試。你必須使用經典的「控制檯應用程序」來做到這一點。我個人使用一個技巧來更容易地在VisualStudio中調試服務:

  • 假設我們有一個ImportService類來處理我們的操作。我們將使用DEBUG編譯常數和創建將開始處理(OnStart方法是受保護的)

    #if DEBUG 
        public void DebugStart() 
        { 
         // Call you processing method 
        } 
    #endif 
    
  • 現在DebugStart()方法,讓我們編輯我們的main()程序方法相同的方式來開始我們的處理,而不是ServiceBase.Run方法調試時:

    #if DEBUG 
        ImportService service = new ImportService(); 
        service.DebugStart(); 
    #else 
        ServiceBase[] ServicesToRun = 
        { 
         new ImportService() 
        }; 
        ServiceBase.Run(ServicesToRun); 
    #endif 
    

這種方式,在調試模式下運行項目時,將啓動該服務爲標準的控制檯程序。 installutil命令是用於安裝服務程序的Windows命令。要安裝您的服務,您有多種解決方案,具體取決於您的安裝程序:

  • 使用InstallShield。自Visual Studio 2013(或可能是2012?)以來,InstallShield Lite版本被標準包含在以前的Windows Installer中。您必須激活並安裝它(創建其他類型的新項目>配置和部署>激活InstallShield限制版)。您可以以安裝程序的形式安裝Windows服務
  • 製作一個簡單的.bat文件,該文件將在客戶端計算機上運行installutil命令。
  • 使用WiX這是非常完整,但也更復雜,但允許您在安裝過程中做任何事情。
相關問題