إنشاء خدمة لنظام التشغيل Windows في .NET 8
بيئة التشغيل
- فيجوال ستوديو
-
- فيجوال ستوديو 2022
- .صافي
-
- .NET 8
- نوافذ
-
- ويندوز ١١
المتطلبات المسبقه
- فيجوال ستوديو
-
- فيجوال ستوديو 2022
- .صافي
-
- .NET 8
- نوافذ
-
- ويندوز ١٠
- ويندوز ١١
- خادم ويندوز
-
- ويندوز 2012 أو في وقت لاحق
الشرط المسبق
- تم تثبيت Visual Studio بالفعل
في البداية
عندما أحاول إنشاء خدمة Windows في Visual Studio .NET ، لا يوجد سوى قوالب .NET Framework. يمكن أيضا إنشاؤه في .NET (Core) ، ويسمى القالب "خدمة العامل".
في هذه المقالة ، سأشرح كيفية استخدام هذا لإنشاء خدمة Windows وتسجيلها وتشغيلها. محتوى المعالجة ضئيل ، لذلك إذا كان بإمكانك التأكد من أنه يعمل كخدمة Windows ، فيرجى إنشاء الوظيفة.
إنشاء مشروع
بدء تشغيل الاستوديو المرئي. حدد إنشاء مشروع جديد.
أدخل في サービス
حقل البحث أعلاه، ثم حدد خدمة العمال من القائمة.
"خدمات 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 ثانية (1000 مللي ثانية) ، لذا يرجى إعادة كتابته في أي وقت.
تصحيح
يمكنك تصحيح الأخطاء من Visual Studio. كن مطمئنا أنك لن تكون مسجلا بالفعل في الخدمة.
عند تشغيله ، ستظهر وحدة التحكم.
إذا كانت العملية صحيحة ، يمكنك أن ترى أنه تم إنشاء الملف.
إذا كنت تريد إيقاف تصحيح الأخطاء ، فأغلق وحدة التحكم.
إذا قمت بفحص السجل ، يمكنك أن ترى أن عملية بدء الخدمة قد مرت ، لكن عملية الإنهاء لم تنجح. لرؤية الإنهاء ، تحتاج إلى التسجيل فعليا في خدمة Windows للتحقق منه.
أصدر
لكي تتمكن من التسجيل في خدمة Windows ، يجب عليك نشر البرنامج. انقر بزر الماوس الأيمن فوق المشروع واختر نشر.
حدد المجلدات.
موقع المجلد جميل افتراضيا.
سيتم إنشاء إعدادات النشر ، لذا حدد "إظهار جميع الإعدادات".
قم بإعداده على النحو التالي:
قيمةملاحظات | اسم المعلمة | |
---|---|---|
تكوين | الإصدار (افتراضي) | |
الإطار المستهدف | net8.0 (افتراضي) | |
أوضاع النشر | تبعية الإطار | بشكل منفصل لبيئة تسجيل الخدمة. إذا كنت تقوم بتثبيت وقت تشغيل NEt 8 ، فهذا الإعداد على ما يرام. |
وقت التشغيل المستهدف | ويندوز x64 | إذا كان نظام التشغيل بيئة 32 بت ، فحدد win-x86 |
الموقع المستهدف | افتراضي | |
إنشاء ملف واحد | على | |
تجميع جاهز للتشغيل | تعسفي |
بعد الإعداد ، انقر فوق الزر "إرسال".
إذا تم عرض "تم النشر بنجاح" في الزاوية اليسرى السفلية ، فهذا يعني أنه مكتمل.
يمكن فتح ملف الإخراج بالنقر فوق "الموقع المستهدف".
التنسيب في البرنامج والتسجيل في الخدمات
قم بتسجيل الدخول إلى البيئة التي تريد تسجيل خدمة 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 <サービス名>