Erstellen eines Diensts für Windows in .NET 8
Betriebsumgebung
- Visuelles Studio
-
- Visual Studio 2022
- .NETTO
-
- .NET 8
- Fenster
-
- Mit Windows 11
Voraussetzungen
- Visuelles Studio
-
- Visual Studio 2022
- .NETTO
-
- .NET 8
- Fenster
-
- Fenster 10
- Mit Windows 11
- Windows-Server
-
- Windows 2012 oder höher
Vorbedingung
- Visual Studio ist bereits installiert
Zuerst
Wenn ich versuche, einen Windows-Dienst in Visual Studio .NET zu erstellen, gibt es nur .NET Framework-Vorlagen. Sie kann auch in .NET (Core) erstellt werden, und die Vorlage heißt "Workerdienst".
In diesem Artikel werde ich erklären, wie Sie dies zum Erstellen, Registrieren und Ausführen eines Windows-Dienstes verwenden. Der Verarbeitungsinhalt ist minimal, wenn Sie also bestätigen können, dass er als Windows-Dienst ausgeführt wird, erstellen Sie die Funktion.
Erstellen eines Projekts
Starten Sie Visual Studio. Wählen Sie Neues Projekt erstellen aus.
Geben Sie in das サービス
Suchfeld oben ein, und wählen Sie dann Worker-Service aus der Liste aus.
"Windows-Dienste" ist die .NET Framework-Version, für die es keine .NET-Version gibt.
Der Projektname und der Speicherort können beliebig sein. Der Dienst, für den Sie sich registrieren, hat keine Auswirkungen.
「. NET 8.0 ausgewählt ist, und behalten Sie die Standardeinstellungen bei, um es zu erstellen.
Das Projekt wurde erstellt.
Hinzufügen von Bibliotheken
Im Ausgangszustand verfügt es nur über eine "Service"-Funktion und keine Windows-spezifischen Funktionen. Fügen Sie eine Bibliothek hinzu, die von einem Windows-Dienst aus NuGet verwendet werden kann.
Klicken Sie mit der rechten Maustaste auf Abhängigkeiten, und wählen Sie NuGet-Pakete verwalten aus.
Wählen Sie die Registerkarte Durchsuchen aus, und geben Sie sie in das Microsoft.Extensions.Hosting.WindowsServices
Suchfeld ein.
Es wird in der Liste angezeigt, also installieren Sie es.
Klicken Sie auf Übernehmen.
Es wurde als Paket hinzugefügt.
Bearbeiten von Programmen
Dieses Mal werde ich einen Dienst erstellen, der einer Textdatei in regelmäßigen Abständen Text als Herr/Frau hinzufügt.
Program.cs
Fügen Sie die Funktionalität des Windows-Diensts wie folgt hinzu:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Sie können den Klassennamen beliebig ändern, aber für dieses Mal belassen wir die Standardeinstellung.
Standardmäßig gibt es nur Methoden, die verarbeitet werden ExecuteAsync
, wenn der Dienst ausgeführt wird, aber ändern wir sie wie folgt:
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);
}
}
}
Wir haben eine neue Methode und StopAsync
eine neue StartAsync
Methode hinzugefügt.
Wie der Name schon sagt, werden diese Methoden aufgerufen, wenn der Dienst gestartet und gestoppt wird.
Der Inhalt des Prozesses besteht lediglich darin, Ordner zu erstellen und Text zu schreiben, daher lasse ich die Erklärung weg.
ExecuteAsync
Die Methode setzt die Schleife mit stoppingToken fort, bis while
sie für den Abbruch gekennzeichnet wird.
Fügen Sie hinzu, was while
verarbeitet werden soll, während der Dienst ausgeführt wird.
Wenn Sie jedoch nur den Prozess schreiben, den Sie verschieben möchten, wird der Dienst mit voller Kapazität ausgeführt, daher Task.Delay
ist es einfach, ihn zu verschieben, während Sie eine bestimmte Zeit mit der Methode warten.
Standardmäßig ist sie auf 1 Sekunde (1000ms) eingestellt, also schreiben Sie sie bitte jederzeit neu.
debuggen
Sie können über Visual Studio debuggen. Seien Sie versichert, dass Sie nicht wirklich bei dem Dienst registriert sind.
Wenn Sie es ausführen, wird die Konsole angezeigt.
Wenn der Vorgang korrekt ist, können Sie sehen, dass die Datei erstellt wurde.
Wenn Sie das Debuggen beenden möchten, schließen Sie die Konsole.
Wenn Sie das Protokoll überprüfen, können Sie sehen, dass der Dienststartvorgang bestanden wurde, der Beendigungsvorgang jedoch nicht. Um die Beendigung anzuzeigen, müssen Sie sich tatsächlich beim Windows-Dienst registrieren, um sie zu überprüfen.
ausstellen
Um sich bei einem Windows-Dienst registrieren zu können, müssen Sie das Programm veröffentlichen. Klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie Veröffentlichen aus.
Wählen Sie Ordner aus.
Der Speicherort des Ordners ist standardmäßig schön.
Die Veröffentlichungseinstellungen werden erstellt, wählen Sie also "Alle Einstellungen anzeigen".
Richten Sie es wie folgt ein:
Bemerkungen | zum Parameternamen | |
---|---|---|
Konfiguration | Release (Standard) | |
Zielrahmen | net8.0 (Standard) | |
Bereitstellungsmodi | Framework-Abhängigkeit | Separat für die Dienstregistrierungsumgebung. Wenn Sie die NEt 8-Runtime installieren, ist diese Einstellung in Ordnung. |
Ziel-Laufzeit | win-x64 | Wenn es sich bei dem Betriebssystem um eine 32-Bit-Umgebung handelt, wählen Sie win-x86 aus. |
Zielort | Vorgabe | |
Erstellen einer einzelnen Datei | AUF | |
ReadyToRun-Kompilierung | willkürlich |
Klicken Sie nach der Einstellung auf die Schaltfläche "Senden".
Wenn in der unteren linken Ecke "Veröffentlichung war erfolgreich" angezeigt wird, ist sie abgeschlossen.
Die Ausgabedatei kann mit einem Klick auf "Zielort" geöffnet werden.
Programmplatzierung und Einschreibung in Dienste
Melden Sie sich in der Umgebung an, in der Sie den Windows-Dienst mit Administratorrechten registrieren möchten.
Kopieren Sie die veröffentlichte Datei in die Umgebung, in der Sie sie als Windows-Dienst registrieren möchten. Sie können es in einem beliebigen Ordner ablegen, aber denken Sie daran, dass der Windows-Dienst immer auf das Programm in diesem Ordner verweist.
Wenn die veröffentlichte Datei eine Datei mit der Erweiterung .pdb
enthält, kopieren Sie sie nicht in eine Umgebung, in der sie von einer nicht angegebenen Person angezeigt werden kann, da sie Entwicklungsinformationen enthält.
Sobald die Datei vorhanden ist, registrieren Sie sie als Windows-Dienst. Verwenden Sie den Befehl zum Registrieren. Klicken Sie mit der rechten Maustaste auf das Startmenü und wählen Sie "Terminal (Admin)". Herr/Frau wird in einer Windows 11-Umgebung ausgeführt, aber in anderen Umgebungen ist es in Ordnung, eine Eingabeaufforderung mit Administratorrechten zu öffnen.
Im Falle des Terminals ist PowerShell möglicherweise zuerst geöffnet, aber PowerShell kann es möglicherweise nicht korrekt einrichten, also öffnen Sie die "Eingabeaufforderung".
Sie können es mit dem folgenden Befehl beim Windows-Dienst registrieren:
Format
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Beispiel-Eingabe
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
ist der Name, der in der Liste der Windows-Dienste angezeigt wird. Sie können einen separaten Anzeigenamen festlegen, aber wenn Sie keinen Anzeigenamen angeben, wird dieser Name angezeigt.
Es wirkt sich auch auf die Registrierung aus, daher werden alphanumerische Dienstnamen bevorzugt.
start=auto
ist eine Einstellung, mit der der Dienst beim Start von Windows automatisch gestartet wird.
Wenn Sie es manuell starten möchten, löschen Sie diese Beschreibung.
binpath
ist der vollständige Pfad der Programmdateien.
Wenn Sie den Befehl ausführen und [SC] CreateService SUCCESS
anzeigen, ist er erfolgreich.
Die von Ihnen registrierten Dienste sollten in der Liste angezeigt werden.
Starten Sie den Dienst und überprüfen Sie dessen Betrieb
Wenn Sie den Dienst ausführen möchten, können Sie ihn über den Dienstbildschirm oder mit dem folgenden Befehl starten.
sc start <サービス名>
Der Stoppbefehl lautet wie folgt.
sc stop <サービス名>
Wenn Sie den Dienst beenden, können Sie überprüfen, ob der Vorgang zum Herunterfahren ausgeführt wird.
Hinzufügen einer Beschreibung zum Dienst
Das Beschreibungsfeld des hinzugefügten Diensts ist leer, aber Sie können ihn mit dem folgenden Befehl hinzufügen.
sc description <サービス名> "<説明文>"
Löschen eines Dienstes
Wenn Sie den Dienst löschen möchten, können Sie dies mit dem folgenden Befehl tun. Sie müssen über Administratorrechte an der Eingabeaufforderung verfügen.
sc delete <サービス名>