📅  最后修改于: 2023-12-03 14:59:41.100000             🧑  作者: Mango
C# Windows Service 是一个基于 .NET Core 的后台服务程序,可以在 Windows 上自动运行并执行一些任务,比如定时任务、数据收集、网络通信等。这种服务程序与常规的应用程序不同,它没有用户界面,可以自动启动并以后台方式运行,可以在系统启动时自动启动,并在关闭时自动停止。
.NET Core 是一个跨平台的开源框架,它支持 Windows、Linux、macOS 等多种操作系统,以及多种运行时环境,比如 Docker、Azure、Kubernetes 等。使用 .NET Core 可以轻松地开发、构建和部署 C# Windows Service。
首先,我们需要创建一个 .NET Core 项目作为我们的 Windows Service 程序的代码基础。可以使用任何 IDE 或文本编辑器来创建项目,比如 Visual Studio、VS Code 或者命令行。
使用命令行创建 .NET Core 项目:
# 创建项目目录
mkdir WindowsService
cd WindowsService
# 创建 .NET Core 项目
dotnet new console -n MyService
在我们的 Windows Service 程序中,我们需要使用 Microsoft.Extensions.Hosting 和 Microsoft.Extensions.Hosting.WindowsServices NuGet 包来提供服务和管理 Windows 服务生命周期。使用以下命令来安装这两个包:
# 安装 Microsoft.Extensions.Hosting 和 Microsoft.Extensions.Hosting.WindowsServices 包
cd MyService
dotnet add package Microsoft.Extensions.Hosting
dotnet add package Microsoft.Extensions.Hosting.WindowsServices
我们需要编写一些 C# 代码来定义我们的 Windows Service。我们需要继承自 Microsoft.Extensions.Hosting.WindowsServices.WindowsServiceBase 类,并在 StartAsync 和 StopAsync 方法中编写服务的启动和停止逻辑。
以下是一个简单的 Windows Service 示例代码:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.ServiceProcess;
using System.Threading;
using System.Threading.Tasks;
namespace MyService
{
public class MyWindowsService : Microsoft.Extensions.Hosting.WindowsServices.WindowsServiceBase
{
private readonly IHost _host;
private readonly ILogger _logger;
public MyWindowsService(IHost host, ILogger<MyWindowsService> logger)
{
_host = host;
_logger = logger;
}
protected override async void OnStarting(string[] args)
{
_logger.LogInformation("OnStarting...");
await _host.StartAsync();
}
protected override async void OnStopping()
{
_logger.LogInformation("OnStopping...");
await _host.StopAsync(TimeSpan.FromSeconds(10));
}
protected override void Dispose(bool disposing)
{
_logger.LogInformation("Dispose...");
base.Dispose(disposing);
if (disposing)
{
_host.Dispose();
}
}
}
class Program
{
static async Task Main(string[] args)
{
var hostBuilder = Host.CreateDefaultBuilder(args)
.ConfigureServices((services) =>
{
services.AddHostedService<MyWindowsService>();
})
.ConfigureLogging(logging =>
{
logging.AddEventLog();
});
await hostBuilder.RunAsServiceAsync();
}
}
}
在这个简单的 Windows Service 示例代码中,我们通过依赖注入注册了一个 MyWindowsService 类作为 Windows Service。MyWindowsService 继承自 WindowsServiceBase 类,并重写了 OnStarting、OnStopping 和 Dispose 方法。在这些方法中,我们可以编写 Windows Service 的启动和停止逻辑,以及资源管理逻辑。
我们还通过 Host.CreateDefaultBuilder 方法创建一个默认主机生成器,这可以帮助我们轻松地配置和构建主机。我们还使用 AddEventLog 方法将日志输出到 Windows 事件日志中。
Windows Service 必须先注册到 Windows 中,然后才能安装并启动。我们可以使用 sc.exe 命令行工具来注册和安装 Windows Service。
以下是注册和安装 Windows Service 的命令行示例:
# 注册 Windows Service
sc.exe create MyService binPath= "<path-to-your-service-exe>" start= auto
# 安装 Windows Service
sc.exe start MyService
C# Windows Service 是一个非常有用的工具,可以在后台自动运行一些任务,比如定时任务、数据收集、网络通信等。借助 .NET Core 的跨平台性和开源性,我们可以轻松地开发、构建和部署 C# Windows Service。
在本文中,我们介绍了如何创建、注册、安装和运行 C# Windows Service,希望能够帮助程序员更好地理解这种服务程序的原理和操作方法。