Windows Service開發介紹
建立服務
1、選擇新建->專案->Windows桌面,選擇Windows服務。
2、輸入名稱,單擊"確定"。
注意事項:如果在模板中沒有Windws服務,可能是未安裝.NET桌面開發,可以通過選擇左下角開啟Visual Studio選擇安裝程式,選擇.NET桌面開發安裝。
重新命名服務
1、服務建立好,預設名稱是Service1.cs,根本實際業務改為匹配的名稱,修改名稱過程中,會提示"即將重新命名檔案。是否也對此專案中對程式碼元素“Service1
”的所有引用執行重新命名操作?",點選"是"。
2、雙擊服務,在"設計"檢視中,右擊"屬性",在屬性視窗中把ServiceName的值更改為剛才修改的名字。
編寫業務
在"設計"檢視中,點選"切換到程式碼檢視",可以看到,此類繼承了ServiceBase
。
程式碼預設重寫有OnStart和OnStop兩個方法,用於啟動和停止服務對元件的處理。
/// <summary> /// 啟動 /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { Log4netHelper.Info("Demo Service啟動"); // TODO 業務處理 } /// <summary> /// 停止 /// </summary> protected override void OnStop() { Log4netHelper.Info("Demo Service停止"); }
還可以重寫 OnPause、OnContinue 和 OnShutdown 方法來定義對元件的其他處理。
支援通過EventLog寫入事件日誌,需要在"serviceProcessInstaller1"中的Account設定為LocalSystem。
注意事項:不推薦使用此帳戶,因為許可權過大,推薦使用LocalSerice帳戶。
輪詢
通過Timer元件來實現此功能。
示例:
/// <summary> /// 啟動 /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { Log4netHelper.Info("Demo Service啟動"); Timer timer = new Timer(); timer.Interval = 60000; // 60 秒 timer.Elapsed += new ElapsedEventHandler(this.OnTimer); timer.Start(); } /// <summary> /// 定時器事件 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> public void OnTimer(object sender, ElapsedEventArgs args) { // TODO 業務處理 Log4netHelper.Info("Timer執行"); }
新增安裝程式
1、新增安裝程式
雙擊服務名稱,在"設計"檢視中右擊,選擇新增安裝程式。
Visual Studio會向專案中新增一個名為ProjectInstaller元件,其中會包含兩個安裝程式。
2、配置安裝程式
在ProjectInstaller的"設計"檢視中,選擇"serviceProcessInstaller1",右擊選擇屬性,配置引數:
- Account設定為LocalService。
在ProjectInstaller的"設計"檢視中,選擇"serviceInstaller1",右擊選擇屬性,配置引數:
- Account設定為LocalService。
- Description設定服務描述,此描述在"服務"視窗描述列顯示。
- DisplayName設定為Demo服務,此名稱可以不同於ServiceName屬性,它是系統使用的名稱,此名稱在"服務"視窗名稱列顯示。
- ServiceName設定為DemoService,和服務類名稱保持一致。
- StartType設定為Automatic,自啟動。
3、新增自啟動程式
在StartType設定為Automatic,並不能達到程式安裝後啟動,需要在`ProjectInstaller.cs`中增加程式碼。
/// <summary>
/// Ctor
/// </summary>
public ProjectInstaller()
{
InitializeComponent();
// 安裝後自啟動
this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
}
/// <summary>
/// 安裝後發生事件,啟動服務
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ProjectInstaller_Committed(object sender, InstallEventArgs e)
{
System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("DemoService");
controller.Start();
}
注意事項:ServiceController建構函式接收向系統標識該服務的名稱, 也可以是服務的顯示名稱。
安裝服務
使用InstallUtil.exe安裝,啟用Cmd或Windows PowerShell輸入安裝命令。
注意事項:Cmd或Windows PowerShell必須使用管理員模式開啟。
1、安裝
-
32位.NET Framework4或4.5以及更高版本。
安裝:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 檔案所在完整路徑\DemoService.exe
解除安裝:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u 檔案所在完整路徑\DemoService.exe
-
64位.NET Framework4或4.5以及更高版本。
安裝:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe 檔案所在完整路徑\DemoService.exe
解除安裝:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /u 檔案所在完整路徑\DemoService.exe
2、效果
除錯
由於服務的特殊性,無法直接啟動除錯,可以通過附加進行的方式進行調整。
1、附加程序
通過Visual Studio"除錯"選擇"附加到程序"。
2、選擇服務程序
在程序中找到對應的服務。
3、效果
注意事項:
1、附加程序除錯,Visual Studio必須以管理員許可權開啟。
2、如果在附加程序中看不到服務,確認"顯示所有使用者的程序"是否已勾選。
3、服務正常執行時,程式重新編譯會失敗,必須停止服務才能編譯。