Tworzenie usługi dla systemu Windows na platformie .NET 8

Strona zaktualizowana :
Data utworzenia strony :

Środowisko pracy

Visual Studio
  • informacji o wersji Visual Studio 2022
.SIEĆ
  • .NET 8
Windows
  • Okna 11

Warunki wstępne

Visual Studio
  • informacji o wersji Visual Studio 2022
.SIEĆ
  • .NET 8
Windows
  • Okna 10
  • Okna 11
Windows Server
  • Windows 2012 lub nowszy

Warunek wstępny

  • Program Visual Studio jest już zainstalowany

Na początku

Podczas próby utworzenia usługi systemu Windows w programie Visual Studio .NET dostępne są tylko szablony .NET Framework. Można go również utworzyć na platformie .NET (Core), a szablon nosi nazwę "Usługa procesu roboczego".

W tym artykule wyjaśnię, jak używać tego do tworzenia, rejestrowania i uruchamiania usługi systemu Windows. Przetwarzanie zawartości jest minimalne, więc jeśli możesz potwierdzić, że działa jako usługa systemu Windows, utwórz tę funkcję.

Tworzenie projektu

Uruchom program Visual Studio. Wybierz pozycję Utwórz nowy projekt.

Wprowadź w polu wyszukiwania powyżej サービス , a następnie wybierz z listy pozycję Usługa procesu roboczego. "Usługi systemu Windows" to wersja programu .NET Framework, która nie ma wersji platformy .NET.

Nazwa i lokalizacja projektu mogą być dowolne. Nie ma to wpływu na usługę, w której się rejestrujesz.

「. NET 8.0 i pozostaw ustawienia domyślne, aby go utworzyć.

Projekt został utworzony.

Dodawanie bibliotek

W stanie początkowym ma tylko funkcję "service" i nie ma funkcji specyficznych dla systemu Windows. Dodaj bibliotekę, która może być używana przez usługę systemu Windows z NuGet.

Kliknij prawym przyciskiem myszy pozycję Zależności i wybierz polecenie Zarządzaj pakietami NuGet.

Wybierz kartę Przeglądaj i wprowadź w Microsoft.Extensions.Hosting.WindowsServices polu wyszukiwania. Pojawi się na liście, więc zainstaluj go.

Kliknij przycisk Zastosuj.

Został dodany jako pakiet.

Edytowanie programów

Tym razem stworzę usługę, która cyklicznie dodaje tekst do pliku tekstowego jako Pan/Pani.

Program.cs

Dodaj funkcjonalność usługi systemu Windows w następujący sposób:

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

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

Worker.cs

Możesz dowolnie zmienić nazwę klasy, ale na razie pozostawimy domyślną.

Domyślnie istnieją tylko metody, które są ExecuteAsync przetwarzane podczas wykonywania usługi, ale zmieńmy to w następujący sposób:

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);
    }
  }
}

Dodaliśmy nową metodę i StopAsync nową StartAsync metodę. Jak sama nazwa wskazuje, metody te są wywoływane, gdy usługa jest uruchamiana i gdy jest zatrzymywana. Treścią procesu jest po prostu tworzenie folderów i pisanie tekstu, więc pominę wyjaśnienie.

ExecuteAsync Metoda kontynuuje pętlę z stoppingToken, dopóki nie while zostanie oflagowana do anulowania. Dodaj elementy, które while mają być przetwarzane, gdy usługa jest uruchomiona. Jeśli jednak napiszesz tylko proces, który chcesz przenieść, usługa będzie działać z pełną wydajnością, więc Task.Delay podstawowe jest przeniesienie jej podczas oczekiwania na określony czas za pomocą metody. Domyślnie jest ustawiony na 1 sekundę (1000ms), więc prosimy o ponowne zapisanie go w dowolnym momencie.

debugować

Debugowanie można przeprowadzić z poziomu programu Visual Studio. Zapewniamy, że w rzeczywistości nie zostaniesz zarejestrowany w usłudze.

Po uruchomieniu pojawi się konsola.

Jeśli proces jest poprawny, widać, że plik został utworzony.

Jeśli chcesz zatrzymać debugowanie, zamknij konsolę.

Jeśli sprawdzisz dziennik, zobaczysz, że proces uruchamiania usługi minął, ale proces zamykania nie. Aby zobaczyć zakończenie, musisz zarejestrować się w usłudze systemu Windows, aby je zweryfikować.

problem

Aby móc zarejestrować się w usłudze systemu Windows, należy opublikować program. Kliknij projekt prawym przyciskiem myszy i wybierz polecenie Publikuj.

Wybierz opcję Foldery.

Lokalizacja folderu jest domyślnie ładna.

Ustawienia publikowania zostaną utworzone, więc wybierz "Pokaż wszystkie ustawienia".

Skonfiguruj go w następujący sposób:

Nazwa parametru Wartość Uwagi
konfiguracja Wydanie (domyślnie)
Struktura docelowa net8.0 (domyślnie)
Tryby wdrażania Zależność struktury Oddzielnie dla środowiska rejestracji usługi. Jeśli instalowane jest środowisko wykonawcze NEt 8, to ustawienie jest prawidłowe.
Docelowy czas pracy Serwer Win-X64 Jeśli system operacyjny jest środowiskiem 32-bitowym, wybierz pozycję win-x86
Lokalizacja docelowa domyślny
Tworzenie pojedynczego pliku NA
Kompilacja ReadyToRun arbitralny

Po ustawieniu kliknij przycisk "Prześlij".

Jeśli w lewym dolnym rogu zostanie wyświetlony komunikat "Publikowanie powiodło się", oznacza to, że zostało zakończone.

Plik wyjściowy można otworzyć, klikając "Lokalizacja docelowa".

Umieszczanie w Programie i rejestracja w Usługach

Zaloguj się do środowiska, w którym chcesz zarejestrować usługę systemu Windows z uprawnieniami administratora.

Skopiuj opublikowany plik do środowiska, w którym chcesz go zarejestrować jako usługę systemu Windows. Możesz umieścić go w dowolnym folderze, ale pamiętaj, że usługa systemu Windows zawsze będzie odwoływać się do programu w tym folderze.

Ponadto, jeśli opublikowany plik zawiera plik z rozszerzeniem .pdb , nie kopiuj go w środowisku, w którym może być widoczny dla nieokreślonej osoby, ponieważ zawiera informacje programistyczne.

Po umieszczeniu pliku zarejestruj go jako usługę systemu Windows. Użyj polecenia, aby się zarejestrować. Kliknij prawym przyciskiem myszy menu Start i wybierz "Terminal (administrator)". Pan/Pani działa w środowisku Windows 11, ale w innych środowiskach można otworzyć wiersz polecenia z uprawnieniami administratora.

W przypadku terminala PowerShell może być otwarty jako pierwszy, ale PowerShell może nie być w stanie go poprawnie skonfigurować, więc otwórz "Wiersz polecenia".

Możesz zarejestrować go w usłudze systemu Windows za pomocą następującego polecenia:

format

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

Przykładowe dane wejściowe

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

<サービス名> to nazwa, która pojawia się na liście usług systemu Windows. Można ustawić osobną nazwę wyświetlaną, ale jeśli nazwa wyświetlana nie zostanie określona, zostanie ona wyświetlona. Ma to również wpływ na rejestr, dlatego preferowane są alfanumeryczne nazwy usług.

start=auto to ustawienie, które ma automatycznie uruchamiać usługę podczas uruchamiania systemu Windows. Jeśli chcesz uruchomić go ręcznie, usuń ten opis.

binpath to pełna ścieżka do plików programu.

Jeśli wykonasz polecenie i [SC] CreateService SUCCESS wyświetlisz , zakończy się to pomyślnie.

Usługi, które zarejestrowałeś, powinny pojawić się na liście.

Uruchom usługę i sprawdź jej działanie

Jeśli chcesz uruchomić usługę, możesz ją uruchomić z ekranu usługi lub za pomocą następującego polecenia.

sc start <サービス名>

Polecenie stop jest następujące.

sc stop <サービス名>

Jeśli zatrzymasz usługę, możesz sprawdzić, czy proces zamykania jest uruchomiony.

Dodawanie opisu do usługi

Pole opisu dodanej usługi jest puste, ale można je dodać za pomocą następującego polecenia.

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

Usuwanie usługi

Jeśli chcesz usunąć usługę, możesz to zrobić za pomocą następującego polecenia. Musisz mieć uprawnienia administratora w wierszu polecenia.

sc delete <サービス名>