Δημιουργία υπηρεσίας για Windows στο .NET 8
Περιβάλλον λειτουργίας
- Οπτικό στούντιο
-
- Visual Studio 2022
- .ΔΊΧΤΥ
-
- .NET 8
- παράθυρα
-
- Παράθυρα 11
Προϋποθέσεις
- Οπτικό στούντιο
-
- Visual Studio 2022
- .ΔΊΧΤΥ
-
- .NET 8
- παράθυρα
-
- Παράθυρα 10
- Παράθυρα 11
- Διακομιστής των Windows
-
- Windows 2012 ή νεότερη έκδοση
Προϋπόθεση
- Το Visual Studio είναι ήδη εγκατεστημένο
Αρχικά
Όταν προσπαθώ να δημιουργήσω μια υπηρεσία των Windows στο Visual Studio .NET, υπάρχουν μόνο πρότυπα του .NET Framework. Μπορεί επίσης να δημιουργηθεί στο .NET (Core) και το πρότυπο ονομάζεται "Υπηρεσία εργαζομένων".
Σε αυτό το άρθρο, θα εξηγήσω πώς να το χρησιμοποιήσετε για να δημιουργήσετε, να εγγραφείτε και να εκτελέσετε μια υπηρεσία Windows. Το περιεχόμενο επεξεργασίας είναι ελάχιστο, οπότε αν μπορείτε να επιβεβαιώσετε ότι εκτελείται ως υπηρεσία των Windows, δημιουργήστε τη λειτουργία.
Δημιουργία έργου
Ξεκινήστε το Visual Studio. Επιλέξτε Δημιουργία νέου έργου.
Πληκτρολογήστε στο サービス
παραπάνω πεδίο αναζήτησης και, στη συνέχεια, επιλέξτε Υπηρεσία εργαζομένων από τη λίστα.
"Υπηρεσίες των Windows" είναι η έκδοση του .NET Framework, η οποία δεν διαθέτει έκδοση .NET.
Το όνομα και η τοποθεσία του έργου μπορεί να είναι αυθαίρετα. Δεν επηρεάζει την υπηρεσία στην οποία εγγράφεστε.
「. NET 8.0 είναι επιλεγμένο και αφήστε τις προεπιλογές για να το δημιουργήσετε.
Το έργο έχει δημιουργηθεί.
Προσθήκη βιβλιοθηκών
Στην αρχική κατάσταση, έχει μόνο μια λειτουργία "υπηρεσίας" και καμία λειτουργία ειδικά για τα Windows. Προσθέστε μια βιβλιοθήκη που μπορεί να χρησιμοποιηθεί από μια υπηρεσία των Windows από το NuGet.
Κάντε δεξί κλικ στο Εξαρτήσεις και επιλέξτε Διαχείριση πακέτων NuGet.
Επιλέξτε την καρτέλα Αναζήτηση και εισαγάγετε στο Microsoft.Extensions.Hosting.WindowsServices
πεδίο αναζήτησης.
Θα εμφανιστεί στη λίστα, οπότε εγκαταστήστε το.
Κάντε κλικ στην επιλογή Εφαρμογή.
Προστέθηκε ως πακέτο.
Επεξεργασία προγραμμάτων
Αυτή τη φορά, θα δημιουργήσω μια υπηρεσία που προσθέτει περιοδικά κείμενο σε ένα αρχείο κειμένου ως Mr. / Ms.
Program.cs
Προσθέστε τη λειτουργικότητα της υπηρεσίας των Windows ως εξής:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Μπορείτε να αλλάξετε το όνομα της τάξης αυθαίρετα, αλλά για αυτή τη φορά θα αφήσουμε την προεπιλογή.
Από προεπιλογή, υπάρχουν μόνο μέθοδοι που υποβάλλονται ExecuteAsync
σε επεξεργασία κατά την εκτέλεση της υπηρεσίας, αλλά ας την αλλάξουμε ως εξής:
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);
}
}
}
Προσθέσαμε μια νέα μέθοδο και StopAsync
μια νέα StartAsync
μέθοδο.
Όπως υποδηλώνει το όνομα, αυτές οι μέθοδοι καλούνται όταν ξεκινά η υπηρεσία και όταν διακόπτεται.
Το περιεχόμενο της διαδικασίας είναι απλώς η δημιουργία φακέλων και η σύνταξη κειμένου, οπότε θα παραλείψω την εξήγηση.
ExecuteAsync
Η μέθοδος συνεχίζει να επαναλαμβάνεται με stoppingToken μέχρι while
να επισημανθεί για ακύρωση.
Προσθέστε ό,τι while
θέλετε να υποβληθεί σε επεξεργασία κατά την εκτέλεση της υπηρεσίας.
Ωστόσο, εάν γράψετε μόνο τη διαδικασία που θέλετε να μετακινήσετε, η υπηρεσία θα εκτελείται με πλήρη χωρητικότητα, επομένως Task.Delay
είναι βασικό να τη μετακινήσετε ενώ περιμένετε ορισμένο χρόνο με τη μέθοδο.
Από προεπιλογή, έχει οριστεί σε 1 δευτερόλεπτο (1000ms), οπότε ξαναγράψτε το ανά πάσα στιγμή.
Εντοπισμού σφαλμάτων
Μπορείτε να εντοπίσετε σφάλματα από το Visual Studio. Να είστε σίγουροι ότι δεν θα εγγραφείτε πραγματικά στην υπηρεσία.
Όταν το εκτελέσετε, θα εμφανιστεί η κονσόλα.
Εάν η διαδικασία είναι σωστή, μπορείτε να δείτε ότι το αρχείο έχει δημιουργηθεί.
Αν θέλετε να διακόψετε τον εντοπισμό σφαλμάτων, κλείστε την κονσόλα.
Εάν ελέγξετε το αρχείο καταγραφής, μπορείτε να δείτε ότι η διαδικασία έναρξης της υπηρεσίας έχει περάσει, αλλά η διαδικασία τερματισμού δεν έχει. Για να δείτε τον τερματισμό, πρέπει πραγματικά να εγγραφείτε στην υπηρεσία Windows για να το επαληθεύσετε.
ζήτημα
Για να μπορέσετε να εγγραφείτε σε μια υπηρεσία των Windows, πρέπει να δημοσιεύσετε το πρόγραμμα. Κάντε δεξί κλικ στο έργο και επιλέξτε Δημοσίευση.
Επιλέξτε Φάκελοι.
Η θέση του φακέλου είναι ωραία από προεπιλογή.
Θα δημιουργηθούν οι ρυθμίσεις δημοσίευσης, επομένως επιλέξτε "Εμφάνιση όλων των ρυθμίσεων".
Ρυθμίστε το ως εξής:
Όνομα παραμέτρου Παρατηρήσεις τιμής | ||
---|---|---|
διαμόρφωση | Απελευθέρωση (προεπιλογή) | |
Πλαίσιο στόχου | Net8.0 (προεπιλογή) | |
Τρόποι ανάπτυξης | Εξάρτηση πλαισίου | Ξεχωριστά για το περιβάλλον δήλωσης υπηρεσίας. Εάν εγκαθιστάτε το χρόνο εκτέλεσης NEt 8, αυτή η ρύθμιση είναι εντάξει. |
Στόχος χρόνου εκτέλεσης | Win-x64 | Εάν το λειτουργικό σύστημα είναι περιβάλλον 32 bit, επιλέξτε win-x86 |
Τοποθεσία προορισμού | προεπιλογή | |
Δημιουργία μεμονωμένου αρχείου | ΕΠΊ | |
Συλλογή ReadyToRun | αυθαίρετος |
Μετά τη ρύθμιση, κάντε κλικ στο κουμπί "Υποβολή".
Εάν εμφανίζεται η ένδειξη "Η δημοσίευση ήταν επιτυχής" στην κάτω αριστερή γωνία, έχει ολοκληρωθεί.
Το αρχείο εξόδου μπορεί να ανοίξει κάνοντας κλικ στην επιλογή "Τοποθεσία προορισμού".
Τοποθέτηση προγράμματος και εγγραφή σε υπηρεσίες
Συνδεθείτε στο περιβάλλον όπου θέλετε να καταχωρήσετε την υπηρεσία Windows με δικαιώματα διαχειριστή.
Αντιγράψτε το δημοσιευμένο αρχείο στο περιβάλλον όπου θέλετε να το καταχωρήσετε ως υπηρεσία των Windows. Μπορείτε να το τοποθετήσετε σε οποιονδήποτε φάκελο, αλλά λάβετε υπόψη ότι η υπηρεσία των Windows θα αναφέρεται πάντα στο πρόγραμμα σε αυτόν το φάκελο.
Επίσης, εάν το δημοσιευμένο αρχείο περιέχει ένα αρχείο με την επέκταση .pdb
, μην το αντιγράψετε σε περιβάλλον όπου μπορεί να το δει ένα απροσδιόριστο άτομο, επειδή περιέχει πληροφορίες ανάπτυξης.
Μόλις το αρχείο είναι στη θέση του, καταχωρήστε το ως υπηρεσία των Windows. Χρησιμοποιήστε την εντολή για να εγγραφείτε. Κάντε δεξί κλικ στο μενού Έναρξη και επιλέξτε "Τερματικό (Διαχειριστής)". Το Mr./Ms. εκτελείται σε περιβάλλον Windows 11, αλλά σε άλλα περιβάλλοντα, είναι εντάξει να ανοίξετε μια γραμμή εντολών με δικαιώματα διαχειριστή.
Στην περίπτωση του τερματικού, το PowerShell μπορεί να είναι ανοιχτό πρώτα, αλλά το PowerShell ενδέχεται να μην μπορεί να το ρυθμίσει σωστά, επομένως ανοίξτε τη "Γραμμή εντολών".
Μπορείτε να το καταχωρίσετε στην υπηρεσία Windows με την ακόλουθη εντολή:
Μορφή
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Παράδειγμα εισαγωγής
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
είναι το όνομα που εμφανίζεται στη λίστα των υπηρεσιών των Windows. Μπορείτε να ορίσετε ένα ξεχωριστό εμφανιζόμενο όνομα, αλλά εάν δεν καθορίσετε ένα εμφανιζόμενο όνομα, αυτό το όνομα θα εμφανιστεί.
Επηρεάζει επίσης το μητρώο, επομένως προτιμώνται τα αλφαριθμητικά ονόματα υπηρεσιών.
start=auto
είναι μια ρύθμιση για την αυτόματη εκκίνηση της υπηρεσίας κατά την εκκίνηση των Windows.
Εάν θέλετε να το ξεκινήσετε με μη αυτόματο τρόπο, διαγράψτε αυτήν την περιγραφή.
binpath
είναι η πλήρης διαδρομή των αρχείων προγράμματος.
Εάν εκτελέσετε την εντολή και [SC] CreateService SUCCESS
εμφανίσετε , είναι επιτυχής.
Οι υπηρεσίες που καταχωρίσατε θα πρέπει να εμφανίζονται στη λίστα.
Ξεκινήστε την υπηρεσία και ελέγξτε τη λειτουργία της
Εάν θέλετε να εκτελέσετε την υπηρεσία, μπορείτε να την ξεκινήσετε από την οθόνη υπηρεσίας ή με την ακόλουθη εντολή.
sc start <サービス名>
Η εντολή διακοπής έχει ως εξής.
sc stop <サービス名>
Εάν διακόψετε την υπηρεσία, μπορείτε να επαληθεύσετε ότι εκτελείται η διαδικασία τερματισμού λειτουργίας.
Προσθήκη περιγραφής στην υπηρεσία
Το πεδίο περιγραφής της υπηρεσίας που προστέθηκε είναι κενό, αλλά μπορείτε να το προσθέσετε με την ακόλουθη εντολή.
sc description <サービス名> "<説明文>"
Διαγραφή υπηρεσίας
Εάν θέλετε να διαγράψετε την υπηρεσία, μπορείτε να το κάνετε με την ακόλουθη εντολή. Πρέπει να έχετε δικαιώματα διαχειριστή στη γραμμή εντολών.
sc delete <サービス名>