創建服務
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、服務正常運行時,程序重新編譯會失敗,必須停止服務才能編譯。