聊聊WindowServer那些事!
阿新 • • 發佈:2020-08-06
### 前言說明
+ 使用工具:VS2019
+ 思考為什麼要使用WindowServer,它能做什麼了?(後面解答)
### 一:什麼是WindowServer?(我們做的是一個什麼東西?)
Microsoft Windows 服務(過去稱為 NT 服務)允許使用者建立可在其自身的 Windows 會話中長時間執行的可執行應用程式。(微軟爸爸是這麼解釋,簡單介紹)
我的理解,它就是一個掛載在我們系統上的服務,我們系統上服務其實有很多,比如我們的Sql資料庫的服務:MSSQLSERVER,這個是啟動資料庫的一個服務,開啟這個服務我們才能連線本地的安裝的SQL。那WindowServer應該也是一個這樣的服務,可以理解是一個可以讓我們自定義開發的服務。
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806132814225-950235985.png)
### 二:如何建立WindowServer?(我們知道是什麼東西,怎麼做?)
#### 1.開啟VS2019,類別選擇服務,選擇Windows服務類別
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806133309619-855641957.png)
#### 2.新增安裝程式
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806133741209-778882783.png)
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806133905192-117257727.png)
安裝之後,目錄會新增新檔案
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806134459157-1622011751.png)
##### 2.1看看這兩個檔案
###### serviceInstaller1:
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806134934900-1719357404.png)
用的多的屬性:
+ DelayedAutoStart:是否自動啟動
+ Descrition:介紹服務(自定義)
+ DisplayName:標識伺服器友好名稱(自定義)
###### serviceProcessInstaller1:
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806135405178-274318152.png)
+ Account:設定為LocalSystem(執行此服務的賬戶型別)
> 到此,一個服務就寫好,只是他還沒有任何靈魂(業務邏輯)
### 三:怎麼編寫我們的業務邏輯?(在哪裡注入我們的靈魂)
#### 3.1開啟Service1類,按F7進入程式碼介面,如下圖所示:
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806140127170-496515246.png)
當前類有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:(日誌數量有限制,超過一定的數量就不會在顯示了)
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806142459262-356221270.png)
log4net:(自定義,想怎麼存,怎麼存【推薦】)
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806142557896-636086249.png)
### 四:編寫好的服務,如何安裝?(安裝發動機)
#### 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
```
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806145259904-1469554.png)
如上圖示識已經安裝成功!
### 五:安裝好,如何啟動?(點火啟動)
輸入命令:
```
net start 你定義的服務的名稱【二:如何建立WindowServer=>2.新增安裝程式=>DisplayName】
```
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806150624480-74278457.png)
如上圖表示啟動成功
### 六:不想用了,如何停止?(關火休息)
輸入命令:
```
net stop 你定義的服務的名稱【二:如何建立WindowServer=>2.新增安裝程式=>DisplayName】
```
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806145022632-1268550454.png)
如上圖表示關閉成功
### 七:不想要了,如何解除安裝?(拆掉髮動機)
輸入命令:
```
InstallUtil.exe /u C:\**\test\bin\Debug\test.exe
```
![](https://img2020.cnblogs.com/blog/1400941/202008/1400941-20200806145420660-530563991.png)
如上圖表示解除安裝成功
```
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 SundyServer (啟動服務)
4.輸入:net stop SundyServer (停止服務)
5.輸入InstallUtil.exe /u D:\**\**.exe 解除安裝服務
```
### 八:參考文件
[建立 Windows 服務應用](https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer)
### 九:總結
>我為什麼要做這個WindwoServer,是公司需要做一個運維軟體,需要編寫一個Windows服務,我也是看著官方文件學習的,業務邏輯比較簡單, 開發也挺快的。
>自己對Window服務理解,我們其實這種服務也是一個程式,只是它整合到Windows系統服務中,這樣有一個好處,可以設定開機自動啟動,而且還神不知鬼不覺,在客戶電腦上安裝,客戶也不知道,我們是做運維監控,不是幹壞事。可以把一些需要執行的任務,做成服務,放在伺服器或自己電腦服務上,就可以自動跑,設定開機自起。
### 十:不足的地方
+ 本文沒有介紹 EventLog是怎麼來:這個在工具箱中,可以找到,然後點選Service1,做進來就行了
+ 服務預設是啟動和停止方法,還可以擴充套件,有暫停,恢復,這兩個方法,需要我們重寫才能觸發事件