Criar um serviço para Windows no .NET 8

Página atualizada :
Data de criação de página :

Ambiente operacional

Visual Studio
  • Visual Studio 2022
.REDE
  • .NET 8
Windows
  • janelas 11

Pré-requisitos

Visual Studio
  • Visual Studio 2022
.REDE
  • .NET 8
Windows
  • janelas 10
  • janelas 11
Servidor Windows
  • Windows 2012 ou posterior

pré-condição

  • O Visual Studio já está instalado

Inicialmente

Quando tento criar um serviço do Windows no Visual Studio .NET, há apenas modelos do .NET Framework. Ele também pode ser criado no .NET (Core) e o modelo é chamado de "Serviço de Trabalho".

Neste artigo, explicarei como usar isso para criar, registrar e executar um serviço do Windows. O conteúdo de processamento é mínimo, portanto, se você puder confirmar que ele está sendo executado como um serviço do Windows, crie a função.

Criar um projeto

Inicie o Visual Studio. Selecione Criar um novo projeto.

Insira no サービス campo de pesquisa acima e selecione Serviço de Trabalhador na lista. "Serviços do Windows" é a versão do .NET Framework, que não possui uma versão do .NET.

O nome e a localização do projeto podem ser arbitrários. Isso não afeta o serviço para o qual você está se registrando.

「. NET 8.0 estiver selecionado e deixe os padrões para criá-lo.

O projeto foi criado.

Adicionando bibliotecas

No estado inicial, ele tem apenas uma função de "serviço" e nenhuma função específica do Windows. Adicione uma biblioteca que pode ser usada por um serviço do Windows do NuGet.

Clique com o botão direito do mouse em Dependências e selecione Gerenciar Pacotes NuGet.

Selecione a guia Procurar e digite no Microsoft.Extensions.Hosting.WindowsServices campo de pesquisa. Ele aparecerá na lista, então instale-o.

Clique em Aplicar.

Foi adicionado como um pacote.

Editando Programas

Desta vez, vou criar um serviço que periodicamente adiciona texto a um arquivo de texto como um Sr./Sra..

Program.cs

Adicione a funcionalidade do serviço Windows da seguinte maneira:

var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

Worker.cs

Você pode alterar o nome da classe arbitrariamente, mas por enquanto deixaremos o padrão.

Por padrão, existem apenas métodos que são ExecuteAsync processados quando o serviço é executado, mas vamos alterá-lo da seguinte maneira:

public class Worker : BackgroundService
{
  private readonly ILogger<Worker> _logger;

  /// <summary>ログの出力先フォルダパス。</summary>
  private const string OutputLogFolderPath = @"C:\Temporary\";

  /// <summary>ログの出力先ファイルパス。</summary>
  private const string OutputLogFilePath = @$"{OutputLogFolderPath}Test.log";


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

  /// <summary>
  /// サービスが開始されたときに呼ばれます。
  /// </summary>
  /// <param name="stoppingToken"></param>
  /// <returns></returns>
  public override async Task StartAsync(CancellationToken stoppingToken)
  {
    if (Directory.Exists(OutputLogFolderPath) == false)
    {
      Directory.CreateDirectory(OutputLogFolderPath);
    }
    File.AppendAllText(OutputLogFilePath, $"StartAsync サービスを開始しました。\r\n");

    await base.StartAsync(stoppingToken);
  }

  /// <summary>
  /// サービスが終了したときに呼ばれます。
  /// </summary>
  /// <param name="stoppingToken"></param>
  /// <returns></returns>
  public override async Task StopAsync(CancellationToken stoppingToken)
  {
    File.AppendAllText(OutputLogFilePath, $"StopAsync サービスを終了しました。\r\n");
    File.AppendAllText(OutputLogFilePath, $"------------------------------\r\n");

    await base.StopAsync(stoppingToken);
  }

  /// <summary>
  /// サービスが実行されたときに呼ばれます。
  /// </summary>
  /// <param name="stoppingToken">サービスの非同期キャンセルトークン。</param>
  /// <returns></returns>
  protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  {
    while (!stoppingToken.IsCancellationRequested)
    {
      File.AppendAllText(OutputLogFilePath, $"{DateTime.Now}\r\n");

      if (_logger.IsEnabled(LogLevel.Information))
      {
        _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
      }
      await Task.Delay(1000 * 60, stoppingToken);
    }
  }
}

Adicionamos um novo método e StopAsync um novo StartAsync método. Como o nome indica, esses métodos são chamados quando o serviço é iniciado e quando é interrompido. O conteúdo do processo é simplesmente criar pastas e escrever texto, então vou omitir a explicação.

ExecuteAsync O método continua a fazer um loop com stoppingToken até while que ele seja sinalizado para cancelamento. Adicione o que while você deseja que seja processado enquanto o serviço estiver em execução. No entanto, se você escrever apenas o processo que deseja mover, o serviço estará funcionando em plena capacidade, por isso Task.Delay é básico movê-lo enquanto aguarda um certo tempo com o método. Por padrão, ele é definido como 1 segundo (1000ms), portanto, reescreva-o a qualquer momento.

depurar

Você pode depurar do Visual Studio. Tenha certeza de que você não será realmente registrado no serviço.

Quando você executá-lo, o console aparecerá.

Se o processo estiver correto, você poderá ver que o arquivo foi criado.

Se você quiser interromper a depuração, feche o console.

Se você verificar o log, poderá ver que o processo de início do serviço foi aprovado, mas o processo de encerramento não. Para ver o encerramento, você precisa se registrar no serviço do Windows para verificá-lo.

questão

Para poder se registrar em um serviço do Windows, você deve publicar o programa. Clique com o botão direito do mouse no projeto e escolha Publicar.

Selecione Pastas.

A localização da pasta é boa por padrão.

As configurações de publicação serão criadas, então selecione "Mostrar todas as configurações".

Configure-o da seguinte maneira:

do nome do parâmetro
Comentários sobre o valor
configuração Liberação (padrão)
Estrutura de destino net8.0 (padrão)
Modos de implantação Dependência da estrutura Separadamente para o ambiente de registro de serviço. Se você estiver instalando o tempo de execução do NEt 8, essa configuração estará OK.
Tempo de execução de destino Vitória x64 Se o sistema operacional for um ambiente de 32 bits, selecione win-x86
Local de destino inadimplência
Criando um único arquivo EM
Compilação ReadyToRun arbitrário

Após a configuração, clique no botão "Enviar".

Se "A publicação foi bem-sucedida" for exibida no canto inferior esquerdo, ela está concluída.

O arquivo de saída pode ser aberto clicando em "Local de destino".

Colocação e inscrição em serviços

Faça login no ambiente em que deseja registrar o serviço do Windows com privilégios de administrador.

Copie o arquivo publicado para o ambiente em que você deseja registrá-lo como um serviço do Windows. Você pode colocá-lo em qualquer pasta, mas lembre-se de que o serviço do Windows sempre se referirá ao programa nessa pasta.

Além disso, se o arquivo publicado contiver um arquivo com a extensão .pdb , não o copie em um ambiente onde possa ser visto por uma pessoa não especificada, pois contém informações de desenvolvimento.

Depois que o arquivo estiver no lugar, registre-o como um serviço do Windows. Use o comando para se registrar. Clique com o botão direito do mouse no menu Iniciar e selecione "Terminal (Admin)". O Sr./Sra. está sendo executado em um ambiente Windows 11, mas em outros ambientes, não há problema em abrir um prompt de comando com privilégios de administrador.

No caso do terminal, o PowerShell pode ser aberto primeiro, mas o PowerShell pode não ser capaz de configurá-lo corretamente, então abra o "Prompt de Comando".

Você pode registrá-lo no serviço do Windows com o seguinte comando:

formato

sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"

Exemplo de entrada

sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"

<サービス名> é o nome que aparece na lista de serviços do Windows. Você pode definir um nome de exibição separado, mas se não especificar um nome de exibição, esse nome será exibido. Isso também afeta o registro, portanto, os nomes de serviço alfanuméricos são preferidos.

start=auto é uma configuração para iniciar automaticamente o serviço quando o Windows é iniciado. Se você quiser iniciá-lo manualmente, exclua esta descrição.

binpath é o caminho completo dos arquivos do programa.

Se você executar o comando e [SC] CreateService SUCCESS exibir , ele será bem-sucedido.

Os serviços que você registrou devem aparecer na lista.

Inicie o serviço e verifique seu funcionamento

Se você deseja executar o serviço, pode iniciá-lo na tela de serviço ou com o seguinte comando.

sc start <サービス名>

O comando stop é o seguinte.

sc stop <サービス名>

Se você interromper o serviço, poderá verificar se o processo de desligamento está em execução.

Adicionar uma descrição ao serviço

O campo de descrição do serviço adicionado está em branco, mas você pode adicioná-lo com o comando a seguir.

sc description <サービス名> "<説明文>"

Excluindo um serviço

Se você deseja excluir o serviço, pode fazê-lo com o seguinte comando. Você deve ter privilégios de administrador no prompt de comando.

sc delete <サービス名>