C#創建Windows服務

1)創建項目選擇 Windows 窗體應用程序。

2)添加 Windows 服務Service1.cs。在生成的Service1.cs的設計頁面右鍵選擇Add Installer,會生成一個ProjectInstaller.cs。這個文件中有兩個組件:serviceProcessInstaller和serviceInstaller。

對這兩個組件進行設置:

serviceProcessInstaller設置屬性Account爲LocalSystem,這樣創建服務的時候,不需要用戶名和密碼。

serviceInstaller設置屬性ServiceName,Description和DisplayName。ServiceName代表服務名稱,Description代表服務的描述,DisplayName代表服務列表中顯示的名稱,StartType代表啓動類型。注意:設置serviceInstaller的Parent屬性爲serviceProcessInstaller,serviceProcessInstaller的Parent屬性爲ProjectInstaller。

從下圖服務列表可以看出名稱 對應DisplayName,描述 對應Description,啓動類型 對應StartType,登錄爲 對應Account(serviceProcessInstaller)。

服務具體代碼的編寫涉及到service.cs中的OnStart和OnStop兩個函數。

3)安裝服務

右鍵項目-->生成,將生成的文件(如...Test\bin\x64\Release下的文件)拷貝到安裝目錄(如D:\deploy)

找到.NET Framework安裝目錄下的InstallUtil.exe,(如C:\Windows\Microsoft.NET\Framework64\v4.0.30319)。在命令行運行

CD C:\Windows\Microsoft.NET\Framework64\v4.0.30319
InstallUtil.exe -i D:\deploy\Test.exe

然後就可以在服務列表(可運行services.msc打開服務列表)中看到安裝後的服務了。

4)需要注意這幾個事情:

1 StartType即使配置成Automatic,在首次安裝成功之後還是要在服務列表中找到並手工啓動。(當然,可以在OnStart函數中通過編碼實現安裝後自動啓動)

2 在服務中處理,避免不了使用定時器,要注意這裏不能使用Form命名空間下的Timer,因爲服務不是窗體類型的應用,所以不能使用這個組件。要使用System.Timers下的Timer。

3 如果服務執行異常,會導致服務啓動失敗,提示是類似“…服務啓動後停止。某些服務在未由其他服務或程序使用時將自動停止”的語句,這種情況下不容易查出毛病在哪,當然可以通過attach to process來調試,不過我自己更習慣於在普通的form程序中通過按鈕模擬找出程序執行異常的關鍵代碼,修改通過之後再移植到服務的代碼中再測試。

4 要獲取服務所在的目錄,請使用AppDomain.CurrentDomain.BaseDirectory這個只讀屬性。建議需要生成服務的執行情況日誌的,將日誌文件放在服務所在的目錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章