前言說明
- 使用工具:VS2019
- 思考為什么要使用Window服務,它能做什么了?(后面解答)
一:什么是Window服務?(我們做的是一個什么東西?)
Microsoft Windows 服務(過去稱為 NT 服務)允許用戶創建可在其自身的 Windows 會話中長時間運行的可執行應用程序。(微軟爸爸是這么解釋,簡單介紹)
我的理解,它就是一個掛載在我們系統上的服務,我們系統上服務其實有很多,比如我們的Sql數據庫的服務:MSSQLSERVER,這個是啟動數據庫的一個服務,開啟這個服務我們才能連接本地的安裝的SQL。那WindowService應該也是一個這樣的服務,可以理解是一個可以讓我們自定義開發的服務。
二:如何創建WindowService?(我們知道是什么東西,怎么做?)
1.打開VS2019,類別選擇服務,選擇Windows服務類別
2.添加安裝程序
安裝之后,目錄會添加新文件
2.1看看這兩個文件
serviceInstaller1:
用的多的屬性:
- DelayedAutoStart:是否自動啟動
- Descrition:介紹服務(自定義)
- DisplayName:標識服務器友好名稱(自定義)
serviceProcessInstaller1:
- Account:設置為LocalSystem(運行此服務的賬戶類型)
到此,一個服務就寫好,只是他還沒有任何靈魂(業務邏輯)
三:怎么編寫我們的業務邏輯?(在哪里注入我們的靈魂)
3.1打開Service1類,按F7進入代碼界面,如下圖所示:
當前類有3個方法:
- Service1:構造函數
- OnStart:啟動服務時會觸發的方法(可以傳遞參數)
- OnStop:結束服務時會觸發的方法
3.2我們在OnStart和OnStop進行日志打印,代碼如下:
public Service1()
{
InitializeComponent();
eventLog1 = new System.Diagnostics.EventLog();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource", "MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart.");
LogHelper.loginfo.Info("In OnStart.");
}
protected override void OnStop()
{
eventLog1.WriteEntry("In OnStop.");
LogHelper.loginfo.Info("In OnStop.");
}
這里,我使用兩種日志進行打印我們的日志信息
- EventLog:這個是系統自帶一個控件(也是微軟教程中使用的日志記錄)
- log4net:這個是一個第三方庫日志程序集
看看效果:
Eventlog:(日志數量有限制,超過一定的數量就不會在顯示了)
log4net:(自定義,想怎么存,怎么存【推薦】)
四:編寫好的服務,如何安裝?(安裝發動機)
4.1首先編譯程序(快捷鍵:CtrL+Shift+B),生成項目
4.2找到目標文件
- 右鍵項目,選擇在文件資源管理器中打開文件夾
- 找到Debug文件夾下面后綴為****.exe程序
- 賦值路徑:絕對路徑,類是於:[D:****.exe]
- 看看路徑【C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools】,找到工具:Developer Command Prompt for VS 2019允許啟動
4.3 在打開的CMD【就是上面打開的Developer Command Prompt for VS 2019程序,不是我們Win+R打開的】中,輸入命令:
InstallUtil.exe C:\**\test\bin\Debug\test.exe
如上圖標識已經安裝成功!
五:安裝好,如何啟動?(點火啟動)
輸入命令:
net start 你定義的服務的名稱【二:如何創建WindowService=>2.添加安裝程序=>DisplayName】
如上圖表示啟動成功
六:不想用了,如何停止?(關火休息)
輸入命令:
net stop 你定義的服務的名稱【二:如何創建WindowService=>2.添加安裝程序=>DisplayName】
如上圖表示關閉成功
七:不想要了,如何卸載?(拆掉發動機)
輸入命令:
InstallUtil.exe /u C:\**\test\bin\Debug\test.exe
如上圖表示卸載成功
1.找到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools】,找到工具:Developer Command Prompt for VS 2019 啟動
2.輸入InstallUtil.exe D:\**\**.exe,回車安裝服務
3.輸入:net start SundyService (啟動服務)
4.輸入:net stop SundyService (停止服務)
5.輸入InstallUtil.exe /u D:\**\**.exe 卸載服務
八:參考文檔
九:總結
我為什么要做這個WindwoService,是公司需要做一個運維軟件,需要編寫一個Windows服務,我也是看着官方文檔學習的,業務邏輯比較簡單, 開發也挺快的。
自己對Window服務理解,我們其實這種服務也是一個程序,只是它集成到Windows系統服務中,這樣有一個好處,可以設置開機自動啟動,而且還神不知鬼不覺,在客戶電腦上安裝,客戶也不知道,我們是做運維監控,不是干壞事。可以把一些需要執行的任務,做成服務,放在服務器或自己電腦服務上,就可以自動跑,設置開機自起。
十:不足的地方
- 本文沒有介紹 EventLog是怎么來:這個在工具箱中,可以找到,然后點擊Service1,做進來就行了
- 服務默認是啟動和停止方法,還可以擴展,有暫停,恢復,這兩個方法,需要我們重寫才能觸發事件
- 園友提供:Topshelf有興趣試試