Membuat layanan untuk Windows di .NET 8

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan operasi

Visual Studio
  • Visual Studio 2022
.JARING
  • .NET 8
Windows
  • Jendela 11

Prasyarat

Visual Studio
  • Visual Studio 2022
.JARING
  • .NET 8
Windows
  • Jendela 10
  • Jendela 11
Windows Server
  • Windows 2012 atau yang lebih baru

Prasyarat

  • Visual Studio sudah diinstal

Pada awalnya

Ketika saya mencoba membuat layanan Windows di Visual Studio .NET, hanya ada template .NET Framework. Itu juga dapat dibuat di .NET (Core), dan templat diberi nama "Layanan Pekerja".

Pada artikel ini, saya akan menjelaskan cara menggunakan ini untuk membuat, mendaftar, dan menjalankan layanan Windows. Konten pemrosesan minimal, jadi jika Anda dapat mengonfirmasi bahwa itu berjalan sebagai layanan Windows, silakan buat fungsinya.

Membuat proyek

Mulai Visual Studio. Pilih Buat proyek baru.

Masukkan di kolom pencarian サービス di atas, lalu pilih Layanan Pekerja dari daftar. "Layanan Windows" adalah versi .NET Framework, yang tidak memiliki versi .NET.

Nama dan lokasi proyek bisa sewenang-wenang. Ini tidak memengaruhi layanan yang Anda daftarkan.

「. NET 8.0 dipilih, dan biarkan default untuk membuatnya.

Proyek telah dibuat.

Menambahkan Pustaka

Dalam keadaan awal, ia hanya memiliki fungsi "layanan" dan tidak ada fungsi khusus Windows. Tambahkan pustaka yang dapat digunakan oleh layanan Windows dari NuGet.

Klik kanan Dependensi dan pilih Kelola Paket NuGet.

Pilih tab Telusuri dan masukkan di Microsoft.Extensions.Hosting.WindowsServices kolom pencarian. Ini akan muncul dalam daftar, jadi instal.

Klik Terapkan.

Itu ditambahkan sebagai paket.

Mengedit Program

Kali ini, saya akan membuat layanan yang secara berkala menambahkan teks ke file teks sebagai Mr./Ms..

Program.cs

Tambahkan fungsionalitas layanan Windows sebagai berikut:

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

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

Worker.cs

Anda dapat mengubah nama kelas secara sewenang-wenang, tetapi untuk kali ini kita akan membiarkan default.

Secara default, hanya ada metode yang diproses ExecuteAsync saat layanan dijalankan, tetapi mari kita ubah sebagai berikut:

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

Kami telah menambahkan metode baru dan StopAsync metode baruStartAsync. Sesuai dengan namanya, metode ini dipanggil saat layanan dimulai dan saat dihentikan. Isi prosesnya hanyalah membuat folder dan menulis teks, jadi saya akan menghilangkan penjelasannya.

ExecuteAsync Metode ini terus berulang dengan stoppingToken hingga while ditandai untuk pembatalan. Tambahkan apa yang while ingin Anda proses saat layanan berjalan. Namun, jika Anda hanya menulis proses yang ingin Anda pindahkan, layanan akan berjalan dengan kapasitas penuh, jadi Task.Delay mendasar untuk memindahkannya sambil menunggu waktu tertentu dengan metode tersebut. Secara default, ini diatur ke 1 detik (1000ms), jadi silakan tulis ulang kapan saja.

awakutu

Anda dapat men-debug dari Visual Studio. Yakinlah bahwa Anda tidak akan benar-benar terdaftar dengan layanan ini.

Saat Anda menjalankannya, konsol akan muncul.

Jika prosesnya benar, Anda dapat melihat bahwa file telah dibuat.

Jika Anda ingin menghentikan penelusuran kesalahan, tutup konsol.

Jika Anda memeriksa log, Anda dapat melihat bahwa proses mulai layanan telah berlalu, tetapi proses penghentian belum. Untuk melihat penghentian, Anda harus benar-benar mendaftar ke layanan Windows untuk memverifikasinya.

masalah

Agar dapat mendaftar dengan layanan Windows, Anda harus mempublikasikan program tersebut. Klik kanan proyek dan pilih Terbitkan.

Pilih Folder.

Lokasi folder bagus secara default.

Pengaturan penerbitan akan dibuat, jadi pilih "Tampilkan Semua Pengaturan".

Siapkan sebagai berikut:

Parameter
Keterangan Nilai Nama
Konfigurasi Rilis (default)
Kerangka Target net8.0 (default)
Mode Penyebaran Ketergantungan Kerangka Kerja Secara terpisah untuk lingkungan pendaftaran layanan. Jika Anda menginstal runtime NEt 8, pengaturan ini baik-baik saja.
Target Runtime menang-x64 Jika OS adalah lingkungan 32-bit, pilih win-x86
Lokasi Target Default
Membuat satu file Di atas
Kompilasi ReadyToRun sembarang

Setelah pengaturan, klik tombol "Kirim".

Jika "Penerbitan berhasil" ditampilkan di sudut kiri bawah, itu selesai.

File keluaran dapat dibuka dengan mengklik "Lokasi Target".

Penempatan Program dan Pendaftaran dalam Layanan

Masuk ke lingkungan tempat Anda ingin mendaftarkan layanan Windows dengan hak administrator.

Salin file yang diterbitkan ke lingkungan tempat Anda ingin mendaftarkannya sebagai layanan Windows. Anda dapat menempatkannya di folder mana pun, tetapi perlu diingat bahwa layanan Windows akan selalu merujuk ke program di folder itu.

Juga, jika file yang diterbitkan berisi file dengan ekstensi .pdb , jangan menyalinnya di lingkungan di mana dapat dilihat oleh orang yang tidak ditentukan karena berisi informasi pengembangan.

Setelah file terpasang, daftarkan sebagai layanan Windows. Gunakan perintah untuk mendaftar. Klik kanan pada menu Start dan pilih "Terminal (Admin)". Mr./Ms. berjalan di lingkungan Windows 11, tetapi di lingkungan lain, tidak apa-apa untuk membuka command prompt dengan hak administrator.

Dalam kasus terminal, PowerShell mungkin terbuka terlebih dahulu, tetapi PowerShell mungkin tidak dapat mengaturnya dengan benar, jadi buka "Command Prompt".

Anda dapat mendaftarkannya dengan layanan Windows dengan perintah berikut:

format

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

Contoh Masukan

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

<サービス名> adalah nama yang muncul dalam daftar layanan Windows. Anda dapat mengatur nama tampilan terpisah, tetapi jika Anda tidak menentukan nama tampilan, nama ini akan ditampilkan. Ini juga memengaruhi registri, sehingga nama layanan alfanumerik lebih disukai.

start=auto adalah pengaturan untuk memulai layanan secara otomatis saat Windows dimulai. Jika Anda ingin memulainya secara manual, hapus deskripsi ini.

binpath adalah jalur lengkap dari file program.

Jika Anda menjalankan perintah dan [SC] CreateService SUCCESS menampilkan , itu berhasil.

Layanan yang Anda daftarkan akan muncul dalam daftar.

Mulai layanan dan periksa pengoperasiannya

Jika Anda ingin menjalankan layanan, Anda dapat memulainya dari layar layanan atau dengan perintah berikut.

sc start <サービス名>

Perintah stop adalah sebagai berikut.

sc stop <サービス名>

Jika Anda menghentikan layanan, Anda dapat memverifikasi bahwa proses penonaktifan sedang berjalan.

Menambahkan deskripsi ke layanan

Bidang deskripsi layanan yang ditambahkan kosong, tetapi Anda dapat menambahkannya dengan perintah berikut.

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

Menghapus Layanan

Jika Anda ingin menghapus layanan, Anda dapat melakukannya dengan perintah berikut. Anda harus memiliki hak istimewa administrator di prompt perintah.

sc delete <サービス名>