.NET 8 میں Windows کے لئے ایک سروس بنائیں

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

آپریٹنگ ماحول

Visual Studio
  • Visual Studio 2022
.جال
  • .NET 8
Windows
  • ونڈوز 11

ضروری شرائط

Visual Studio
  • Visual Studio 2022
.جال
  • .NET 8
Windows
  • ونڈوز 10
  • ونڈوز 11
Windows Server
  • ونڈوز 2012 یا اس کے بعد

پیشگی شرائط

  • Visual Studio پہلے ہی انسٹال ہے

سب سے پہلے

جب میں بصری اسٹوڈیو ڈاٹ نیٹ میں ونڈوز سروس بنانے کی کوشش کرتا ہوں تو ، صرف .NET فریم ورک ٹیمپلیٹس موجود ہیں۔ یہ .NET (کور) میں بھی بنایا جا سکتا ہے، اور ٹیمپلیٹ کو "ورکر سروس" کا نام دیا گیا ہے.

اس مضمون میں ، میں وضاحت کروں گا کہ ونڈوز سروس بنانے ، رجسٹر کرنے اور چلانے کے لئے اس کا استعمال کیسے کریں۔ پروسیسنگ کا مواد کم سے کم ہے ، لہذا اگر آپ تصدیق کرسکتے ہیں کہ یہ ونڈوز سروس کے طور پر چل رہا ہے تو ، براہ کرم فنکشن بنائیں۔

ایک منصوبہ بنائیں

Visual Studio شروع کریں۔ نیا منصوبہ بنائیں منتخب کریں۔

مندرجہ サービス بالا سرچ فیلڈ میں داخل کریں ، اور پھر فہرست سے ورکر سروس منتخب کریں۔ "ونڈوز سروسز" .NET فریم ورک ورژن ہے ، جس میں .NET ورژن نہیں ہے۔

پروجیکٹ کا نام اور مقام من مانی ہوسکتی ہے۔ یہ اس خدمت کو متاثر نہیں کرتا ہے جس کے لئے آپ اندراج کر رہے ہیں.

「. NET 8.0 منتخب کیا جاتا ہے، اور اسے بنانے کے لئے ڈیفالٹ کو چھوڑ دیں.

منصوبہ بنایا گیا ہے.

لائبریریوں کا اضافہ

ابتدائی حالت میں ، اس میں صرف ایک "سروس" فنکشن ہے اور ونڈوز کے مخصوص افعال نہیں ہیں۔ ایک لائبریری شامل کریں جو نیوگیٹ سے ونڈوز سروس کے ذریعہ استعمال کی جاسکتی ہے۔

انحصار پر دائیں کلک کریں اور نوگیٹ پیکیجز کا انتظام کریں منتخب کریں۔

براؤز ٹیب منتخب کریں اور سرچ فیلڈ میں داخل ہوں Microsoft.Extensions.Hosting.WindowsServices ۔ یہ فہرست میں ظاہر ہوگا ، لہذا اسے انسٹال کریں۔

لاگو کریں پر کلک کریں۔

یہ ایک پیکیج کے طور پر شامل کیا گیا تھا.

پروگراموں میں ترمیم

اس بار ، میں ایک ایسی سروس تخلیق کروں گا جو وقتا فوقتا ٹیکسٹ فائل میں مسٹر / مس کے طور پر متن شامل کرتی ہے۔

Program.cs

ونڈوز سروس کی فعالیت درج ذیل کے مطابق شامل کریں:

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 یہ طریقہ ٹوکن کو روکنے کے ساتھ اس وقت تک لوپ کرتا رہتا ہے جب تک while کہ اسے منسوخی کے لئے جھنڈی نہیں دی جاتی۔ سروس کے چلنے کے دوران آپ جو عمل کرنا چاہتے ہیں اسے شامل کریں while ۔ تاہم ، اگر آپ صرف وہی عمل لکھتے ہیں جسے آپ منتقل کرنا چاہتے ہیں تو ، سروس پوری صلاحیت پر چل رہی ہوگی ، لہذا Task.Delay طریقہ کار کے ساتھ ایک خاص وقت کا انتظار کرتے ہوئے اسے منتقل کرنا بنیادی ہے۔ پہلے سے طے شدہ طور پر ، یہ 1 سیکنڈ (1000 ایم ایم) پر سیٹ کیا گیا ہے ، لہذا براہ کرم کسی بھی وقت اسے دوبارہ لکھیں۔

debug

آپ بصری اسٹوڈیو سے ڈی بگ کرسکتے ہیں۔ یقین رکھیں کہ آپ اصل میں سروس کے ساتھ رجسٹرڈ نہیں ہوں گے.

جب آپ اسے چلائیں گے تو ، کنسول ظاہر ہوگا۔

اگر عمل درست ہے تو ، آپ دیکھ سکتے ہیں کہ فائل بنائی گئی ہے۔

اگر آپ ڈیبگنگ کو روکنا چاہتے ہیں تو ، کنسول بند کریں۔

اگر آپ لاگ چیک کرتے ہیں تو ، آپ دیکھ سکتے ہیں کہ سروس شروع کرنے کا عمل گزر گیا ہے ، لیکن اختتام کا عمل نہیں ہوا ہے۔ اختتام کو دیکھنے کے لئے ، آپ کو اصل میں اس کی تصدیق کرنے کے لئے ونڈوز سروس کے ساتھ رجسٹر کرنے کی ضرورت ہے۔

اجرا

ونڈوز سروس کے ساتھ اندراج کرنے کے قابل ہونے کے لئے، آپ کو پروگرام شائع کرنا ہوگا. پروجیکٹ پر دائیں کلک کریں اور شائع کریں کا انتخاب کریں۔

فولڈر منتخب کریں۔

فولڈر کا مقام پہلے سے طے شدہ طور پر اچھا ہے۔

پبلشنگ کی ترتیبات بنائی جائیں گی ، لہذا "تمام ترتیبات دکھائیں" منتخب کریں۔

اسے مندرجہ ذیل کے مطابق ترتیب دیں:

پیرامیٹر کا نام قدر تبصرے
تشکیل ریلیز (پہلے سے طے شدہ)
ہدف فریم ورک net8.0 (default)
تعیناتی کے طریقے Framework Dependency سروس رجسٹریشن کے ماحول کے لئے الگ سے. اگر آپ این ای ٹی 8 رن ٹائم انسٹال کر رہے ہیں تو ، یہ ترتیب ٹھیک ہے۔
Target Runtime Win-x64 اگر او ایس ایک 32 بٹ ماحول ہے تو ، جیتنے والے x86 کو منتخب کریں۔
ہدف کا مقام طے شدہ
ایک ہی فائل بنانا پر
تیار کرنے کے لئے تالیف من مانی

ترتیب دینے کے بعد ، "جمع کروائیں" بٹن پر کلک کریں۔

اگر "پبلشنگ کامیاب تھی" کو نچلے بائیں کونے میں دکھایا جاتا ہے تو ، یہ مکمل ہے۔

آؤٹ پٹ فائل کو "ہدف مقام" پر کلک کرکے کھولا جاسکتا ہے۔

خدمات میں پروگرام کی جگہ اور اندراج

اس ماحول میں لاگ ان کریں جہاں آپ منتظم کی مراعات کے ساتھ ونڈوز سروس کو رجسٹر کرنا چاہتے ہیں۔

شائع شدہ فائل کو اس ماحول میں کاپی کریں جہاں آپ اسے ونڈوز سروس کے طور پر رجسٹر کرنا چاہتے ہیں۔ آپ اسے کسی بھی فولڈر میں رکھ سکتے ہیں ، لیکن ذہن میں رکھیں کہ ونڈوز سروس ہمیشہ اس فولڈر میں پروگرام کا حوالہ دے گی۔

اس کے علاوہ ، اگر شائع شدہ فائل میں توسیع .pdb کے ساتھ فائل موجود ہے تو ، اسے ایسے ماحول میں کاپی نہ کریں جہاں اسے ایک نامعلوم شخص دیکھ سکتا ہے کیونکہ اس میں ترقیاتی معلومات شامل ہیں۔

ایک بار فائل موجود ہونے کے بعد ، اسے ونڈوز سروس کے طور پر رجسٹر کریں۔ رجسٹر کرنے کے لئے کمانڈ کا استعمال کریں۔ اسٹارٹ مینو پر دائیں کلک کریں اور "ٹرمینل (ایڈمن)" منتخب کریں۔ مسٹر / مس ونڈوز 11 ماحول میں چل رہا ہے ، لیکن دوسرے ماحول میں ، ایڈمنسٹریٹر مراعات کے ساتھ کمانڈ پرامپٹ کھولنا ٹھیک ہے۔

ٹرمینل کی صورت میں ، پاور شیل پہلے کھلا ہوسکتا ہے ، لیکن پاور شیل اسے صحیح طریقے سے ترتیب دینے کے قابل نہیں ہوسکتا ہے ، لہذا "کمانڈ پرامپٹ" کھولیں۔

آپ اسے درج ذیل کمانڈ کے ساتھ ونڈوز سروس کے ساتھ رجسٹر کرسکتے ہیں:

وضع

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

مثال ان پٹ

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

<サービス名> وہ نام ہے جو ونڈوز خدمات کی فہرست میں ظاہر ہوتا ہے۔ آپ ایک علیحدہ ڈسپلے نام سیٹ کرسکتے ہیں ، لیکن اگر آپ ڈسپلے نام کی وضاحت نہیں کرتے ہیں تو ، یہ نام ظاہر ہوگا۔ یہ رجسٹری کو بھی متاثر کرتا ہے ، لہذا الفانیومرک سروس کے ناموں کو ترجیح دی جاتی ہے۔

start=auto ونڈوز شروع ہونے پر خود بخود سروس شروع کرنے کے لئے ایک ترتیب ہے۔ اگر آپ اسے دستی طور پر شروع کرنا چاہتے ہیں تو ، اس تفصیل کو حذف کریں۔

binpath پروگرام فائلوں کا مکمل راستہ ہے۔

اگر آپ کمانڈ اور [SC] CreateService SUCCESS ڈسپلے پر عمل کرتے ہیں تو ، یہ کامیاب ہے۔

آپ کی رجسٹرڈ خدمات کو فہرست میں ظاہر ہونا چاہئے۔

سروس شروع کریں اور اس کا آپریشن چیک کریں

اگر آپ سروس چلانا چاہتے ہیں تو ، آپ اسے سروس اسکرین سے یا مندرجہ ذیل کمانڈ کے ساتھ شروع کرسکتے ہیں۔

sc start <サービス名>

اسٹاپ کمانڈ مندرجہ ذیل ہے۔

sc stop <サービス名>

اگر آپ سروس کو روکتے ہیں تو ، آپ اس بات کی تصدیق کرسکتے ہیں کہ شٹ ڈاؤن کا عمل چل رہا ہے۔

خدمت میں تفصیل شامل کریں

اضافی سروس کی وضاحت کا میدان خالی ہے ، لیکن آپ اسے مندرجہ ذیل کمانڈ کے ساتھ شامل کرسکتے ہیں۔

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

کسی سروس کو حذف کرنا

اگر آپ سروس کو حذف کرنا چاہتے ہیں تو ، آپ مندرجہ ذیل کمانڈ کے ساتھ ایسا کرسکتے ہیں۔ کمانڈ پرامپٹ پر آپ کے پاس ایڈمنسٹریٹر استحقاق ہونا ضروری ہے۔

sc delete <サービス名>