建立Windows Service

基本參照使用C#建立Windows服務,添加了部份內容html

目錄

建立Windows Service
可視化管理Windows Service
調試
示例代碼git

建立Windows Service

選擇C#標籤的Windows Service項目,並建立
1
2
初始結構目錄以下
3
修改Service1爲TimingService
雙擊TimingService.cs,如圖所示
4
點擊末尾的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
5
出現兩個組件,serviceProcessInstaller1serviceInstaller1,對它們的屬性進行修改c#

serviceInstaller1

6
ServiceName改成TimingService,是在windows service列表裏面的服務名稱
Description改成"一個計時器",這裏設置的是在windows service列表裏面的服務描述
StartType默認爲Manual(手動)
相關資料:
ServiceInstaller Classwindows

serviceProcessInstaller1

7
將Account改成LocalSystem
右鍵項目點擊生成,在\bin\Debug目錄下生成MyWindowsService.exe
至此,Windows Service建立完畢
相關資料:
ServiceProcessInstaller Classapi

可視化管理Windows Service

建立一個Windows Form項目MyWindowsService.Client
8
在窗體內添加四個按鈕,分別爲安裝服務、啓動服務、中止服務及卸載服務
9
引入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項目中右鍵添加文件應用程序清單
10
將原來的內容測試

<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
11
能夠右鍵服務點擊屬性進行管理
12

調試

不少種方式,
1.添加一個控制檯程序調用業務方法調試
2.打日誌調試
3.附加到進程調試
4.官方給的方式,很簡單
如何:調試 Windows 服務應用程序
一、三、4適合跟進調試,2適合長期測試並查看問題

示例代碼

示例代碼

參考資料

如何:建立 Windows 服務
使用C#建立Windows服務

相關文章
相關標籤/搜索