?Windows?服務?同時啟動多個服務
?獨立觀察員?2019.02.26
最近需要開發 Windows Service 程序,之前沒有接觸過,所以把了解到的一些東西記錄下來。
Windows 服務程序可以簡單理解為需要長時間在后臺運行, 而又不需要界面顯示的程序,在計算機管理 --> 服務和應用程序 --> 服務中可以看到:
我們先來新建一個 "Windows 服務" 項目,具體可參考《C# 編寫 Windows Service(windows 服務程序)》(https://www.cnblogs.com/bluestorm/p/3510398.html)一文。
邏輯寫在繼承于 ServiceBase 類的類中,該類型的類通過添加 "Windows 服務" 來生成:
雙擊生成的類文件,打開的是一個設計頁面,可點擊切換到代碼視圖:
代碼視圖中可以看到,是繼承于 ServiceBase 類的,主要邏輯寫在 OnStart 和 OnStop 方法中:
在 Service1 的設計頁面右鍵 -->"添加安裝程序",生成 ProjectInstaller.cs ,也是個設計頁面,包含一個 serviceProcessInstaller1 組件和一個 serviceInstaller1 組件:
其中 serviceProcessInstaller1 屬性中一般將 Account 的值改為 LocalSystem :
而 serviceInstaller1 的屬性中,Description 是描述信息,DisplayName 是顯示的名稱,都在開頭提到的系統服務管理頁面中顯示。ServiceName 指定了程序中使用該服務要用的名稱。StartType 一般選為 Automatic,代表了自動啟動:
然后就是安裝和啟動了,有好幾種方法,本文采用 InstallUtil.exe 和?批處理?結合的方式。InstallUtil.exe 命令行工具在 % SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe 路徑下,可以直接帶路徑使用,也可以拷到項目中使用。
下面給出批出理代碼:
安裝和啟動服務
CD /D "%~dp0"
InstallUtil WindowsServiceTest.exe
net start Service1
net start Service2
pause
其中第一行是 cd 到當前目錄。第二行是安裝服務,WindowsServiceTest.exe 是服務所在的程序名。第三行是啟動其中的 Service1 服務。
2、單獨啟動服務
net start Service1
net start Service2
pause
3、停止服務
net stop Service1
net stop Service2
pause
4、卸載服務
CD /D "%~dp0"
installutil /u WindowsServiceTest.exe
pause
大家可能發現了,除了 Service1,里面還有個 Service2,這就是接下來要講的安裝兩個以上服務的方法。(只使用一個服務的話,要把 Service2 刪除)
首先按照之前的方法添加 Service2,然后照樣添加安裝程序,會出現在之前的地方(新增了一個 serviceInstaller2):
接下來打開 Projectlnstaller.Designer.cs 文件,這個是 VS 自動生成的,本來是不需要我們修改的,但這里似乎有一個 bug (參考:《[c# windows?服務?一個進程?多個服務的使用](https://blog.csdn.net/dkdhn/article/details/50126819)》):
就是上圖中的紅框框住的一句(AddRange 方法中的 this.serviceInstaller2)并沒有自動添加上,所以我們手動加上。
然后在程序入口函數 Program.Main () 中添加 Service2 的調用:
這樣之后就可以生成程序了,然后以管理員身份運行批處理文件(安裝和啟動服務.bat):
然后在服務管理頁面就可以看到了:
再運行 卸載服務.bat :
程序功能也都生效了:
好了,就說這些了,最后提供下示例代碼地址:https://gitee.com/dlgcy/WindowsServiceTest