基本參照使用C#建立Windows服務,添加了部份內容html
建立Windows Service
可視化管理Windows Service
調試
示例代碼git
選擇C#標籤的Windows Service項目,並建立
初始結構目錄以下
修改Service1爲TimingService
雙擊TimingService.cs,如圖所示
點擊末尾的switch to code view
進入代碼編輯頁面github
public partial class TimingService : ServiceBase { public TimingService() { InitializeComponent(); } protected override void OnStart(string[] args) { } protected override void OnStop() { } }
在OnStart和OnStop方法中寫上服務啓動、中止須要完成的工做
這裏咱們寫一個計時器,每分鐘錄入一條日誌,在此不贅述,能夠看示例代碼瞭解
在設計界面右鍵菜單欄,點擊Add Installer
出現兩個組件,serviceProcessInstaller1
和serviceInstaller1
,對它們的屬性進行修改c#
ServiceName改成TimingService,是在windows service列表裏面的服務名稱
Description改成"一個計時器",這裏設置的是在windows service列表裏面的服務描述
StartType默認爲Manual(手動)
相關資料:
ServiceInstaller Classwindows
將Account改成LocalSystem
右鍵項目點擊生成
,在\bin\Debug
目錄下生成MyWindowsService.exe
至此,Windows Service建立完畢
相關資料:
ServiceProcessInstaller Classapi
建立一個Windows Form項目MyWindowsService.Client
在窗體內添加四個按鈕,分別爲安裝服務、啓動服務、中止服務及卸載服務
引入System.ServiceProcess.dll和System.Configuration.Install.dll,完善相關功能app
//須要引用MyWindowsService項目 string serviceFilePath = $"{Application.StartupPath}\\MyWindowsService.exe"; //這裏是設置的serviceName,不是項目名稱或者生成的exe的名稱 string serviceName = "TimingService"; /// <summary> /// 安裝服務 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void InstallButton_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceName); this.InstallService(serviceFilePath); } /// <summary> /// 啓動服務 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void StartButton_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName); } /// <summary> /// 中止服務 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void StopButton_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName); } /// <summary> /// 卸載服務 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UninstallButton_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) { this.ServiceStop(serviceName); this.UninstallService(serviceFilePath); } } //判斷服務是否存在 private bool IsServiceExisted(string serviceName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController sc in services) { if (sc.ServiceName.ToLower() == serviceName.ToLower()) { return true; } } return false; } //安裝服務 private void InstallService(string serviceFilePath) { using (AssemblyInstaller installer = new AssemblyInstaller()) { installer.UseNewContext = true; installer.Path = serviceFilePath; IDictionary savedState = new Hashtable(); installer.Install(savedState); installer.Commit(savedState); } } //卸載服務 private void UninstallService(string serviceFilePath) { using (AssemblyInstaller installer = new AssemblyInstaller()) { installer.UseNewContext = true; installer.Path = serviceFilePath; installer.Uninstall(null); } } //啓動服務 private void ServiceStart(string serviceName) { using (ServiceController control = new ServiceController(serviceName)) { if (control.Status == ServiceControllerStatus.Stopped) { control.Start(); } } } //中止服務 private void ServiceStop(string serviceName) { using (ServiceController control = new ServiceController(serviceName)) { if (control.Status == ServiceControllerStatus.Running) { control.Stop(); } } }
爲了後續管理服務方便,在MyWindowsService.Client引用MyWindowsServiceide
須要使用Administrator的權限才能安裝服務
在MyWindowsService.Client項目中右鍵添加文件應用程序清單
將原來的內容測試
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
改成下面的內容ui
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
以管理員身份啓動程序的相關資料:
How do I force my .NET application to run as administrator?
以後從新生成MyWindowsService.Client,在\bin\Debug文件夾下打開MyWindowsService.Client.exe
使用MyWindowsService.Client.exe安裝並啓動MyWindowsService.exe
能夠右鍵服務點擊屬性
進行管理
不少種方式,
1.添加一個控制檯程序調用業務方法調試
2.打日誌調試
3.附加到進程調試
4.官方給的方式,很簡單
如何:調試 Windows 服務應用程序
一、三、4適合跟進調試,2適合長期測試並查看問題