创建Windows Service

基本参照使用C#创建Windows服务,添加了部分内容

目录

创建Windows Service
可视化管理Windows Service
调试
示例代码

创建Windows Service

选择C#标签的Windows Service项目,并创建
1
2
初始结构目录如下
3
修改Service1为TimingService
双击TimingService.cs,如图所示
4
点击末尾的switch to code view进入代码编辑页面

public partial class TimingService : ServiceBase
{
    public TimingService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
    }

    protected override void OnStop()
    {
    }
}

在OnStart和OnStop方法中写上服务启动、停止需要完成的工作
这里我们写一个计时器,每分钟录入一条日志,在此不赘述,可以看示例代码了解
在设计界面右键菜单栏,点击Add Installer
5
出现两个组件,serviceProcessInstaller1serviceInstaller1,对它们的属性进行修改

serviceInstaller1

6
ServiceName改为TimingService,是在windows service列表里面的服务名称
Description改为"一个计时器",这里设置的是在windows service列表里面的服务描述
StartType默认为Manual(手动)
相关资料:
ServiceInstaller Class

serviceProcessInstaller1

7
将Account改为LocalSystem
右键项目点击生成,在\bin\Debug目录下生成MyWindowsService.exe
至此,Windows Service创建完毕
相关资料:
ServiceProcessInstaller Class

可视化管理Windows Service

创建一个Windows Form项目MyWindowsService.Client
8
在窗体内添加四个按钮,分别为安装服务、启动服务、停止服务及卸载服务
9
引入System.ServiceProcess.dll和System.Configuration.Install.dll,完善相关功能

//需要引用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引用MyWindowsService

获得管理员权限

需要使用Administrator的权限才能安装服务
在MyWindowsService.Client项目中右键添加文件应用程序清单
10
将原来的内容

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

改为下面的内容

<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 服务应用程序
1、3、4适合跟进调试,2适合长期测试并查看问题

示例代码

示例代码

参考资料

使用C#创建Windows服务
如何:创建 Windows 服务

转载于:https://www.cnblogs.com/Lulus/p/11147623.html

C#创建Windows Service涉及几个关键步骤。以下是创建一个基础Windows Service的简要指南: **Step 1:添加项目模板** - 打开Visual Studio,选择“文件”> “新建”> “项目”。 - 在“模板”区域选择“Windows服务”类别,比如“Class Library (Windows Service)”,然后输入项目名称并点击“创建”。 **Step 2:设计服务类** - 在生成的新项目中,会有一个名为`YourServiceName.cs`的服务类,继承自`ServiceBase`类。 - 需要在服务类中重写一些基本方法,如`OnStart()`用于初始化服务开始时的操作,`OnStop()`负责清理资源。 ```csharp using System.ServiceProcess; public partial class YourServiceName : ServiceBase { public YourServiceName() { InitializeComponent(); } protected override void OnStart(string[] args) { // 在这里编写服务开始时执行的任务,如开启定时任务或其他操作 DoWork(); } protected override void OnStop() { // 在这里编写服务停止时执行的清理操作 } private void DoWork() { // 实际的服务业务逻辑代码 } } ``` **Step 3:配置服务属性** - 在解决方案资源管理器中找到你的服务项目,右键单击选择“属性”。 - 在属性窗口中,切换到“常规”选项卡,设置“名称”、“描述”等基本信息。 - 然后转到“服务行为”选项卡,勾选“此项目作为服务运行”。 **Step 4:部署和注册服务** - 你可以直接在调试模式下测试服务,但在生产环境中通常需要先发布应用。 - 使用`installutil.exe`命令行工具安装服务,或者通过Visual Studio的“工具”>“附件”>“Windows服务控制器”来手动安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值