.NET6打包部署到Windows Service的全过程

  • Post category:C#

以下是.NET6打包部署到Windows Service的全过程攻略:

1. 什么是Windows Service

Windows Service是一种在后台运行的应用程序,它可以在Windows操作系统启动时自动启动,并在系统关闭时自动停止。Windows Service通常用于执行长时间运行的任务,例如监视文件夹、处理消息队列等。

2. 如何将.NET6应用程序打包为Windows Service

将.NET6应用程序打包为Windows Service,需要按照以下步骤操作:

2.1. 步骤1:创建.NET6应用程序

首先,我们需要创建一个.NET6应用程序。可以使用Visual Studio 2019或更高版本创建.NET6应用程序。

2.2. 步骤2:安装Microsoft.Extensions.Hosting.WindowsServices NuGet包

接下来,我们需要安装Microsoft.Extensions.Hosting.WindowsServices NuGet包。这个NuGet包包含了将.NET6应用程序打包为Windows Service所需的类和方法。

可以使用以下命令在.NET6应用程序中安装Microsoft.Extensions.Hosting.WindowsServices NuGet包:

dotnet add package Microsoft.Extensions.Hosting.WindowsServices

2.3. 步骤3:修改Program.cs文件

接下来,我们需要修改Program.cs文件,以便将.NET6应用程序打包为Windows Service。

以下是一个示例,演示如何修改Program.cs文件:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace MyService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var isService = !(Debugger.IsAttached || args.Contains("--console"));

            var builder = CreateHostBuilder(args.Where(arg => arg != "--console").ToArray());

            if (isService)
            {
                var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
                var pathToContentRoot = Path.GetDirectoryName(pathToExe);
                builder.UseWindowsService();
            }

            var host = builder.Build();

            if (isService)
            {
                host.RunAsService();
            }
            else
            {
                host.Run();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });
    }
}

在上面的代码中,我们使用UseWindowsService方法将.NET6应用程序打包为Windows Service。我们还使用RunAsService方法运行Windows Service。

2.4. 步骤4:创建Windows Service

现在,我们可以创建Windows Service。可以使用以下命令在.NET6应用程序的目录中创建Windows Service:

sc create MyService binPath= "C:\path\to\MyService.exe"

在上面的命令中,MyService是Windows Service的名称,C:\path\to\MyService.exe是.NET6应用程序的路径。

2.5. 步骤5:启动Windows Service

现在,我们可以启动Windows Service。可以使用以下命令启动Windows Service:

sc start MyService

在上面的命令中,MyService是Windows Service的名称。

3. 示例1:创建一个简单的Windows Service

在这个示例中,我们将演示如何创建一个简单的Windows Service。按照以下步骤操作:

  1. 创建一个名为Worker的类,用于执行长时间运行的任务。
public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

在上面的代码中,我们创建了一个名为Worker的类,它继承自BackgroundService类。Worker类包含一个名为ExecuteAsync的方法,用于执行长时间运行的任务。在这个示例中,我们使用ILogger记录日志,并使用Task.Delay模拟长时间运行的任务。

  1. 修改Program.cs文件,以便将.NET6应用程序打包为Windows Service。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace MyService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var isService = !(Debugger.IsAttached || args.Contains("--console"));

            var builder = CreateHostBuilder(args.Where(arg => arg != "--console").ToArray());

            if (isService)
            {
                var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
                var pathToContentRoot = Path.GetDirectoryName(pathToExe);
                builder.UseWindowsService();
            }

            var host = builder.Build();

            if (isService)
            {
                host.RunAsService();
            }
            else
            {
                host.Run();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });
    }
}

在上面的代码中,我们使用UseWindowsService方法将.NET6应用程序打包为Windows Service。我们还使用RunAsService方法运行Windows Service。

  1. 创建Windows Service。

可以使用以下命令在.NET6应用程序的目录中创建Windows Service:

sc create MyService binPath= "C:\path\to\MyService.exe"

在上面的命令中,MyService是Windows Service的名称,C:\path\to\MyService.exe是.NET6应用程序的路径。

  1. 启动Windows Service。

可以使用以下命令启动Windows Service:

sc start MyService

在上面的命令中,MyService是Windows Service的名称。

4. 示例2:使用配置文件配置Windows Service

在这个示例中,我们将演示如何使用配置文件配置Windows Service。按照以下步骤操作:

  1. 创建一个名为appsettings.json的配置文件,用于配置Windows Service。
{
  "MyService": {
    "Interval": 5000
  }
}

在上面的代码中,我们创建了一个名为MyService的配置节,它包含一个名为Interval的属性,表示任务执行的间隔时间。

  1. 修改Program.cs文件,以便将.NET6应用程序打包为Windows Service,并使用配置文件配置Windows Service。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace MyService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var isService = !(Debugger.IsAttached || args.Contains("--console"));

            var builder = CreateHostBuilder(args.Where(arg => arg != "--console").ToArray());

            if (isService)
            {
                var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
                var pathToContentRoot = Path.GetDirectoryName(pathToExe);
                builder.UseWindowsService();
            }

            var host = builder.Build();

            if (isService)
            {
                host.RunAsService();
            }
            else
            {
                host.Run();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                })
                .ConfigureServices((hostContext, services) =>
                {
                    services.Configure<MyServiceOptions>(hostContext.Configuration.GetSection("MyService"));
                    services.AddHostedService<Worker>();
                });
    }
}

在上面的代码中,我们使用ConfigureAppConfiguration方法加载配置文件。我们还使用Configure方法配置MyServiceOptions类,它表示Windows Service的配置。我们使用AddHostedService方法添加Worker类作为Windows Service的后台服务。

  1. 创建Windows Service。

可以使用以下命令在.NET6应用程序的目录中创建Windows Service:

sc create MyService binPath= "C:\path\to\MyService.exe"

在上面的命令中,MyService是Windows Service的名称,C:\path\to\MyService.exe是.NET6应用程序的路径。

  1. 启动Windows Service。

可以使用以下命令启动Windows Service:

sc start MyService

在上面的命令中,MyService是Windows Service的名称。

结论

通过以上步骤,我们可以将.NET6应用程序打包为Windows Service,并使用配置文件配置Windows Service。我们可以创建一个名为Worker的类,用于执行长时间运行的任务。我们可以使用UseWindowsService方法将.NET6应用程序打包为Windows Service。我们可以使用RunAsService方法运行Windows Service。我们可以使用ConfigureAppConfiguration方法加载配置文件,并使用Configure方法配置Windows Service的配置。我们可以使用AddHostedService方法添加Worker类作为Windows Service的后台服务。