Windows服務也稱爲Windows Service,它是Windows操做系統和Windows網絡的基礎,屬於系統核心的一部分,它支持着整個Windows的各類操做。諸如DNS客戶端、打印程序、Windows更新服務、計劃任務、Windows時間服務、告警器等服務,它們關係到機器可否正確運行。若是不能適當地管理這些服務,就會影響到機器的正常操做。html
Microsoft Windows 服務可以建立在它們本身的 Windows 會話中可長時間運行的可執行應用程序。這些服務能夠在計算機啓動時自動啓動,能夠暫停和從新啓動並且不顯示任何用戶界面。這使服務很是適合在服務器上使用,或任什麼時候候,爲了避免影響在同一臺計算機上工做的其餘用戶,須要長時間運行功能時使用。windows
本文介紹瞭如何用C#建立、安裝、啓動、監控、卸載簡單的Windows Service 的內容步驟和注意事項。服務器
1、建立一個Windows Service網絡
1)建立Windows Service項目ide
2)對Service重命名工具
將Service1重命名爲你服務名稱,這裏咱們命名爲ServiceTest。url
2、建立服務安裝程序spa
1)添加安裝程序操作系統
以後咱們能夠看到上圖,自動爲咱們建立了ProjectInstaller.cs以及2個安裝的組件。調試
2)修改安裝服務名
右鍵serviceInsraller1,選擇屬性,將ServiceName的值改成ServiceTest。
3)修改安裝權限
右鍵serviceProcessInsraller1,選擇屬性,將Account的值改成LocalSystem。
3、寫入服務代碼
1)打開ServiceTest代碼
右鍵ServiceTest,選擇查看代碼。
2)寫入Service邏輯
添加以下代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; namespace WindowsServiceTest { public partial class ServiceTest : ServiceBase { public ServiceTest() { InitializeComponent(); } protected override void OnStart(string[] args) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start."); } } protected override void OnStop() { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop."); } } } } |
這裏咱們的邏輯很簡單,啓動服務的時候寫個日誌,關閉的時候再寫個日誌。
4、建立安裝腳本
打開vs的開發人員命令提示 工具 以管理員身份運行
執行以下所示命令:
①進入到項目所在文件夾,並進入\bin\Debug\路徑下
②安裝服務命令:installutil ConsoleApplication.exe,而後就能夠在服務列表中看到咱們啓動的服務:
卸載服務的命令是:installutil /u ConsoleApplication.exe
當咱們修改代碼後,須要把服務先卸載,才能從新生成成功
③啓動服務
啓動服務後,等一下子再中止服務,而後咱們打開D盤下的1.txt文檔,能夠看到下圖所示的結果:
4)腳本調試
若是須要查看腳本運行情況,在腳本最後一行加入pause
5、在C#中對服務進行控制
0)配置目錄結構
簡歷一個新WPF項目,叫WindowsServiceTestUI,添加對System.ServiceProcess的引用。
在WindowsServiceTestUI的bin\Debug目錄下創建Service目錄。
將WindowsServiceTest的生成目錄設置爲上面建立的Service目錄。
生成後目錄結構以下圖
1)安裝
安裝時會產生目錄問題,因此安裝代碼以下:
1 2 3 4 5 6 7 8 |
string CurrentDirectory = System.Environment.CurrentDirectory; System.Environment.CurrentDirectory = CurrentDirectory + "\\Service"; Process process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = "Install.bat"; process.StartInfo.CreateNoWindow = true; process.Start(); System.Environment.CurrentDirectory = CurrentDirectory; |
2)卸載
卸載時也會產生目錄問題,因此卸載代碼以下:
1 2 3 4 5 6 7 8 |
string CurrentDirectory = System.Environment.CurrentDirectory; System.Environment.CurrentDirectory = CurrentDirectory + "\\Service"; Process process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = "Uninstall.bat"; process.StartInfo.CreateNoWindow = true; process.Start(); System.Environment.CurrentDirectory = CurrentDirectory; |
3)啓動
代碼以下:
1 2 3 4 5 |
using System.ServiceProcess; ServiceController serviceController = new ServiceController("ServiceTest"); serviceController.Start(); |
4)中止
1 2 3 |
ServiceController serviceController = new ServiceController("ServiceTest"); if (serviceController.CanStop) serviceController.Stop(); |
5)暫停/繼續
1 2 3 4 5 6 7 8 |
ServiceController serviceController = new ServiceController("ServiceTest"); if (serviceController.CanPauseAndContinue) { if (serviceController.Status == ServiceControllerStatus.Running) serviceController.Pause(); else if (serviceController.Status == ServiceControllerStatus.Paused) serviceController.Continue(); } |
6)檢查狀態
1 2 |
ServiceController serviceController = new ServiceController("ServiceTest"); string Status = serviceController.Status.ToString(); |
6、調試Windows Service
1)安裝並運行服務
2)附加進程
3)在代碼中加入斷點進行調試