قم بإنشاء سطر أوامر التحرير والسرد / تطبيق خدمة Windows
-
03-07-2019 - |
سؤال
ما هي أفضل طريقة في لغة #C لإعداد تطبيق أداة مساعدة يمكن تشغيله من سطر الأوامر وإنتاج بعض المخرجات (أو الكتابة إلى ملف)، ولكن يمكن تشغيله كخدمة Windows أيضًا للقيام بعمله في الخلفية (على سبيل المثالمراقبة دليل، أو أيا كان).
أرغب في كتابة الكود مرة واحدة وأتمكن من استدعائه بشكل تفاعلي من PowerShell أو بعض واجهة سطر الأوامر (CLI) الأخرى، ولكن في الوقت نفسه أجد أيضًا طريقة لتثبيت نفس ملف EXE كخدمة Windows وتشغيله دون مراقبة.
هل يمكنني فعل هذا؟وإذا كان الأمر كذلك:كيف يمكنني أن أفعل هذا؟
المحلول
نعم يمكنك ذلك.
تتمثل إحدى طرق القيام بذلك في استخدام معلمة سطر الأوامر، على سبيل المثال "/console"، لتمييز إصدار وحدة التحكم عن التشغيل كإصدار خدمة:
- قم بإنشاء تطبيق Windows Console ثم
- في Program.cs، وبشكل أكثر دقة في الوظيفة الرئيسية، يمكنك اختبار وجود المعلمة "/console"
- إذا كان "/console" موجودًا، فابدأ البرنامج بشكل طبيعي
- إذا لم تكن المعلمة موجودة، فاستدعاء فئة الخدمة الخاصة بك من ServiceBase
// Class that represents the Service version of your app
public class serviceSample : ServiceBase
{
protected override void OnStart(string[] args)
{
// Run the service version here
// NOTE: If you're task is long running as is with most
// services you should be invoking it on Worker Thread
// !!! don't take too long in this function !!!
base.OnStart(args);
}
protected override void OnStop()
{
// stop service code goes here
base.OnStop();
}
}
...
ثم في Program.cs:
static class Program
{
// The main entry point for the application.
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
if ((args.Length > 0) && (args[0] == "/console"))
{
// Run the console version here
}
else
{
ServicesToRun = new ServiceBase[] { new serviceSample () };
ServiceBase.Run(ServicesToRun);
}
}
}
نصائح أخرى
وأفضل طريقة لتحقيق ذلك من وجهة نظر تصميم هو تنفيذ كل ما تبذلونه من وظيفة في مشروع مكتبة وبناء مشاريع المجمع منفصلة حوله لتنفيذ بالطريقة التي تريدها (أي خدمة ويندوز، برنامج سطر الأوامر، وآسيا والمحيط الهادئ. صافي خدمة الإنترنت، خدمة WCF الخ)
ونعم يمكن القيام به.
والطبقة بدء التشغيل لديك يجب أن تمتد ServiceBase.
هل يمكن استخدام جهاز الرئيسي خالية ثابت (سلسلة [] وسائط) طريقة بدء التشغيل لتحليل تبديل سطر الأوامر لتشغيل في وضع وحدة التحكم.
وشيء من هذا القبيل:
static void Main(string[] args)
{
if ( args == "blah")
{
MyService();
}
else
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
وهناك خدمة ويندوز هو مختلف تماما عن برنامج ويندوز العادي؛ كنت أفضل حالا لا تحاول أن تفعل شيئين في وقت واحد.
هل تعتبر مما يجعل من مهمة مجدولة بدلا من ذلك؟