前言
在實際應用過程中,有時候我們希望開發的程序,不需要界面,直接開機就可以長時間運行,這時候,我們可以考慮做成一個Windows服務。
這篇文章跟大家介紹一下,如何基於C#實現Windows服務的創建、安裝、啓動、停止和卸載。
Windows服務介紹
Microsoft Windows 服務能夠創建在它們自己的 Windows 會話中可長時間運行的可執行應用程序。這些服務可以在計算機啓動時自動啓動,可以暫停和重新啓動而且不顯示任何用戶界面。這使服務非常適合在服務器上使用,或任何時候,爲了不影響在同一臺計算機上工作的其他用戶,需要長時間運行功能時使用。還可以在不同於登錄用戶的特定用戶賬戶或默認計算機賬戶的安全上下文中運行服務。
創建Windows服務
1、創建一個新項目,項目類型選擇Windows服務,如下圖所示:
2、項目名稱修改爲thinger.WindowsServiceDemo,創建完成界面如下所示:
3、爲了方便區分,將類名Service1改成MyService。
4、在設計界面,右擊鼠標,會出現如下彈窗,選擇添加安裝程序,並點擊添加安裝程序。
5、點擊添加安裝程序之後,會自動添加一個ProjectInstaller界面,裏面有兩個組件,分別是serviceProcessInstaller和serviceInstaller。
6、先選擇serviceInstaller進行屬性設置,主要可以設置以下屬性:
- ServiceName:服務名稱,這個後續會使用到。
- Description:描述,可以自己添加一下說明
- StartType:啓動類型,可以設置爲手動或自動
7、接着選擇ProjectInstaller進行設置,主要設置Account,指示用來運行此服務的賬戶類型,可以設置爲LocalSystem
8、設置完成之後,切換到MyService這個類,點擊切換到代碼視圖,我們可以看到後臺有一些自動生成的代碼:
public partial class MyService : ServiceBase
{
public MyService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
}
從名稱可以看出,這裏重寫了OnStart和OnStop接口,可以在這裏寫一些啓動服務和停止服務的邏輯。
9、寫了一個簡單的邏輯,就是每次服務啓動或停止都會向指定的文件中寫入一串信息。
protected override void OnStart(string[] args)
{
WriteInfo("服務啓動");
}
protected override void OnStop()
{
WriteInfo("服務停止");
}
private string filePath = @"D:\ServiceLog.txt";
private void WriteInfo(string info)
{
using (FileStream stream = new FileStream(filePath, FileMode.Append))
{
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine($"{DateTime.Now},{info}");
}
}
}
10、點擊項目,右擊生成。
11、這樣,一個簡單的Windows服務就創建完成了。
安裝卸載Windows服務
我們直接運行剛剛創建的服務,發現是無法運行的,提示使用installutil.exe來運行。
如果安裝了VS,這個exe應用程序在C盤裏可以找到的,具體路徑爲:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe
接下來,我們使用這個exe來進行安裝和卸載Windows服務。
1、首先,使用管理員權限打開CMD,然後進入這個路徑下,便於直接操作InstallUtil。
2、安裝服務命令:installutil exe絕對路徑 ;卸載服務命令:installutil exe絕對路徑 -u ;查看安裝執行結果:
打開服務,可以看到TestService這個名稱的服務已經安裝完成,
3、安裝完成後,雙擊打開,可以啓動服務:
4、也可以手動停止服務:
5、觀察D盤文件,是否存在信息:
6、卸載服務結果: