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這個只讀屬性。建議需要生成服務的執行情況日誌的,將日誌文件放在服務所在的目錄下。