سؤال

هل هناك طريقة أسهل إلى الخطوة من خلال رمز من أن تبدأ الخدمة من خلال إدارة التحكم بالخدمة Windows ثم إرفاق مصحح الأخطاء في الموضوع ؟ انها نوع من مرهقة وأنا أتساءل إذا كان هناك نهج أكثر وضوحا.

هل كانت مفيدة؟

المحلول

إذا كنت ترغب في الحصول بسرعة على التصحيح الخدمة ، أنا مجرد قطرة في Debugger.Break() في هناك.عندما يتم الوصول إلى خط ، وسوف تنخفض إلي مقابل.لا ننسى أن إزالة هذا الخط عندما كنت فعلت.

تحديث: كبديل #if DEBUG pragmas ، يمكنك أيضا استخدام Conditional("DEBUG_SERVICE") السمة.

[Conditional("DEBUG_SERVICE")]
private static void DebugMode()
{
    Debugger.Break();
}

على OnStart, فقط اتصل بهذا الأسلوب:

public override void OnStart()
{
     DebugMode();
     /* ... do the rest */
}

هناك قانون سوف يكون فقط خلال تمكين التصحيح يبني.في حين الخاص بك على ذلك ، قد يكون من المفيد إنشاء منفصلة بناء التكوين من أجل خدمة التصحيح.

نصائح أخرى

وأعتقد أيضا وجود مستقل "نسخة" من أجل التنفيذ العادي و كخدمة هو الطريق للذهاب ، ولكن هل هو حقا المطلوبة لتكريس منفصل تبديل سطر الأوامر لهذا الغرض ؟

لا يمكنك فقط القيام به:

public static int Main(string[] args)
{
  if (!Environment.UserInteractive)
  {
    // Startup as service.
  }
  else
  {
    // Startup as application
  }
}

أن يكون "صالح" ، أنه يمكنك فقط بدء تشغيل التطبيق الخاص بك عن طريق دبل كليك (حسنا ، إذا كنت حقا بحاجة إلى ذلك) و التي يمكنك أن تصل فقط F5 في Visual Studio (دون الحاجة إلى تعديل إعدادات المشروع ليشمل ذلك /console الخيار).

من الناحية الفنية ، Environment.UserInteractive الشيكات إذا كان WSF_VISIBLE العلم هو مجموعة النافذة الحالية المحطة ، ولكن هل هناك أي سبب آخر حيث سيعود false, بصرف النظر عن كونها تشغيل (غير تفاعلية) ؟

عندما أنشأت خدمة جديدة من المشروع قبل أسابيع قليلة وجدت هذا المنصب.في حين أن هناك العديد من الاقتراحات كبيرة, أنا لا تزال لم تجد الحل أردت:إمكانية استدعاء خدمة الطبقات' OnStart و OnStop أساليب دون أي تعديل على خدمة الطبقات.

الحل خطرت يستخدم Environment.Interactive حدد تشغيل وضع ، كما اقترح إجابات أخرى إلى هذا المنصب.

static void Main()
{
    ServiceBase[] servicesToRun;
    servicesToRun = new ServiceBase[] 
    {
        new MyService()
    };
    if (Environment.UserInteractive)
    {
        RunInteractive(servicesToRun);
    }
    else
    {
        ServiceBase.Run(servicesToRun);
    }
}

على RunInteractive مساعد يستخدم انعكاس الاتصال المحمية OnStart و OnStop الأساليب:

static void RunInteractive(ServiceBase[] servicesToRun)
{
    Console.WriteLine("Services running in interactive mode.");
    Console.WriteLine();

    MethodInfo onStartMethod = typeof(ServiceBase).GetMethod("OnStart", 
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Starting {0}...", service.ServiceName);
        onStartMethod.Invoke(service, new object[] { new string[] { } });
        Console.Write("Started");
    }

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine(
        "Press any key to stop the services and end the process...");
    Console.ReadKey();
    Console.WriteLine();

    MethodInfo onStopMethod = typeof(ServiceBase).GetMethod("OnStop", 
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Stopping {0}...", service.ServiceName);
        onStopMethod.Invoke(service, null);
        Console.WriteLine("Stopped");
    }

    Console.WriteLine("All services stopped.");
    // Keep the console alive for a second to allow the user to see the message.
    Thread.Sleep(1000);
}

هذا هو كل رمز المطلوبة ، ولكن أنا أيضا كتب تجول مع التفسيرات.

في بعض الأحيان من المهم أن نحلل ما يحدث أثناء بدء تشغيل الخدمة. ربط العملية لا تساعد هنا ، لأنه لم تكن سريعة بما فيه الكفاية إرفاق مصحح الأخطاء أثناء الخدمة يتم بدء تشغيل.

الجواب القصير هو, أنا باستخدام التالية 4 أسطر من التعليمات البرمجية للقيام بذلك:

#if DEBUG
    base.RequestAdditionalTime(600000); // 600*1000ms = 10 minutes timeout
    Debugger.Launch(); // launch and attach debugger
#endif

هذه هي إدراجها في OnStart طريقة الخدمة على النحو التالي:

protected override void OnStart(string[] args)
{
    #if DEBUG
       base.RequestAdditionalTime(600000); // 10 minutes timeout for startup
       Debugger.Launch(); // launch and attach debugger
    #endif
    MyInitOnstart(); // my individual initialization code for the service
    // allow the base class to perform any work it needs to do
    base.OnStart(args);
}

بالنسبة لأولئك الذين لم تكن قد فعلت ذلك من قبل ، ولقد تضمنت مفصلة تلميحات أدناه, لأنه يمكنك بسهولة الحصول على عالقا.التالية تلميحات تشير إلى ويندوز 7x64 و Visual Studio 2010 فريق Edition, ولكن يجب أن تكون صالحة لمدة البيئات الأخرى أيضا.


المهم: نشر الخدمة في "دليل" الوضعية ، (إما باستخدام InstallUtil فائدة من مقابل موجه الأوامر أو تشغيل الخدمة المثبت مشروع كنت قد أعدت).فتح Visual Studio قبل بدء تشغيل الخدمة و تحميل محلول يحتوي على التعليمات البرمجية المصدر - إعداد إضافية من نقاط التوقف كما تحتاج لهم في Visual Studio - ثم بدء تشغيل الخدمة عن طريق خدمة "لوحة التحكم".

بسبب Debugger.Launch الكود هذا سوف يتسبب في مربع الحوار "معالج Microsoft .NET Framework استثناء حدثت في Servicename.exe." على ما يبدو.انقر Elevate نعم التصحيح Servicename.exe كما هو مبين في الصورة:
FrameworkException

بعد ذلك escpecially في ويندوز 7 UAC قد يطالبك بإدخال بيانات اعتماد المسؤول.أدخل عليها والمضي قدما نعم:

UACPrompt

بعد ذلك معروفة Visual Studio فقط في الوقت المصحح نافذة يظهر.فإنه يسألك إذا كنت ترغب في تصحيح باستخدام delected المصحح. قبل النقر فوق نعم, حدد أنك لا أريد فتح مثيل جديد (الخيار 2) - نسخة جديدة لن تكون مفيدة هنا ، لأن التعليمات البرمجية المصدر لن يتم عرض.إذا قمت بتحديد Visual Studio سبيل المثال كنت قد فتحت في وقت سابق بدلا من ذلك:VSDebuggerPrompt

بعد النقر نعم, بعد حين Visual Studio سوف يظهر السهم الأصفر في خط فيها Debugger.Launch البيان و كنت قادرا على تصحيح التعليمات البرمجية الخاصة بك (طريقة MyInitOnStart, الذي يحتوي على ملف التهيئة).VSDebuggerBreakpoint

الضغط F5 يستمر التنفيذ على الفور ، حتى توقف لديك استعداد يتم التوصل إليه.

تلميح: للحفاظ على تشغيل الخدمة ، اختر تصحيح -> فصل كل.هذا يسمح لك بتشغيل العميل التواصل مع خدمة ما بعد ذلك بدأت بشكل صحيح و الانتهاء من التصحيح بدء تشغيل التعليمات البرمجية.إذا كنت اضغط التحول+F5 (إيقاف التصحيح) ، وهذا سيتم إنهاء الخدمة.بدلا من القيام بذلك, يجب عليك استخدام خدمة لوحة التحكم لوقف ذلك.

ملاحظة أن

  • إذا كنت بناء الإصدار ، ثم رمز التصحيح تلقائيا إزالة و يتم تشغيل الخدمة بشكل طبيعي.

  • أنا باستخدام Debugger.Launch(), ، يبدأ إرفاق مصحح أخطاء.لقد اختبرت Debugger.Break() كذلك ، لم تنجح, لأنه لا يوجد مصحح تعلق على بدء الخدمة بعد (تسبب "خطأ 1067:عملية إنهاء غير متوقع.").

  • RequestAdditionalTime مجموعات أطول مهلة بدء التشغيل من الخدمة (فمن لا تأخير القانون نفسه ، ولكن سوف تواصل على الفور مع Debugger.Launch البيان).وإلا فإن المهلة الافتراضية لبدء الخدمة قصيرة جدا و بدأت فشل الخدمة إذا كنت لا الاتصال base.Onstart(args) بسرعة كافية من المصحح.عمليا مهلة 10 دقائق يتجنب أن ترى رسالة "لم تستجب الخدمة..." مباشرة بعد المصحح هو بدأ.

  • بمجرد أن تعتاد على ذلك, هذه الطريقة سهلة جدا لأنه يتطلب فقط أن إضافة 4 خطوط القائمة رمز الخدمة, مما يسمح لك بسرعة للسيطرة و التصحيح.

عادة ما أقوم به هو تغليف منطق الخدمة في فئة منفصلة ونبدأ من 'عداء' الفئة.هذا عداء فئة يمكن أن يكون في الخدمة الفعلية أو مجرد تطبيق وحدة التحكم.لذلك الحل (على الأقل) 3 مشاريع:

/ConsoleRunner
   /....
/ServiceRunner
   /....
/ApplicationLogic
   /....

هذا فيديو يوتيوب عن طريق فابيو Scopel يشرح كيفية تصحيح Windows الخدمة بشكل جيد جدا...الطريقة الفعلية من فعل ذلك يبدأ في 4:45 في الفيديو...

هنا هو رمز هو موضح في الفيديو...في البرنامج الخاص بك.cs الملف ، إضافة أشياء قسم التصحيح...

namespace YourNamespace
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
#if DEBUG
            Service1 myService = new Service1();
            myService.OnDebug();
            System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new Service1()
            };
            ServiceBase.Run(ServicesToRun);
#endif

        }
    }
}

في Service1.cs الملف ، إضافة OnDebug() طريقة...

    public Service1()
    {
        InitializeComponent();
    }

    public void OnDebug()
    {
        OnStart(null);
    }

    protected override void OnStart(string[] args)
    {
        // your code to do something
    }

    protected override void OnStop()
    {
    }

كيف يعمل

أساسا لديك لإنشاء public void OnDebug() أن يدعو OnStart(string[] args) كما انها محمية لا يمكن الوصول إليها من الخارج.على void Main() برنامج يضاف مع #if المعالج مع #DEBUG.

Visual Studio يعرف DEBUG إذا كان المشروع هو تجميع في وضع التصحيح.وهذا سوف يسمح قسم التصحيح(أدناه) لتنفيذ عندما يكون الشرط صحيحا

Service1 myService = new Service1();
myService.OnDebug();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

وأنه سيتم تشغيل فقط مثل تطبيق وحدة التحكم مرة واحدة في الأمور تسير حسنا يمكنك تغيير الوضعية ، Release و العادية else القسم سوف يؤدي منطق

التحديث

هذا النهج هو إلى حد بعيد أسهل:

http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

أترك بلدي الأصلي الإجابة أدناه للأجيال القادمة.


خدماتي تميل إلى أن تكون الطبقة التي بتغليف الموقت كما أريد خدمة تحقق في فترات منتظمة إذا كان هناك أي عمل أن يفعل.

ونحن جديدة حتى الصف والدعوة StartEventLoop() خلال خدمة بدء التشغيل.(هذه الفئة يمكن استخدامها بسهولة من وحدة التحكم التطبيق أيضا.)

لطيفة آثار جانبية من هذا التصميم هو أن الحجج التي يمكنك تعيين جهاز ضبط الوقت يمكن استخدامها أن يكون هناك تأخير قبل الخدمة في الواقع يبدأ العمل ، بحيث يكون لديك الوقت إرفاق مصحح الأخطاء يدويا.

p.s. كيفية إرفاق مصحح الأخطاء يدويا إلى عملية تشغيل...?

using System;
using System.Threading;
using System.Configuration;    

public class ServiceEventHandler
{
    Timer _timer;
    public ServiceEventHandler()
    {
        // get configuration etc.
        _timer = new Timer(
            new TimerCallback(EventTimerCallback)
            , null
            , Timeout.Infinite
            , Timeout.Infinite);
    }

    private void EventTimerCallback(object state)
    {
        // do something
    }

    public void StartEventLoop()
    {
        // wait a minute, then run every 30 minutes
        _timer.Change(TimeSpan.Parse("00:01:00"), TimeSpan.Parse("00:30:00");
    }
}

كما اعتدت أن تفعل ما يلي (سبق ذكره في الإجابات السابقة ولكن مع الشرطي مترجم [إذا] أعلام للمساعدة في تجنب ذلك إطلاق النار في بيان بناء).

توقفت عن القيام بهذه الطريقة لأنه في بعض الأحيان كنا ننسى أن بناء في الإفراج لديك مصحح أخطاء كسر في التطبيق قيد التشغيل على العميل التجريبي (محرج!).

#if DEBUG
if (!System.Diagnostics.Debugger.IsAttached)
{
    System.Diagnostics.Debugger.Break();
}
#endif

static void Main()
{
#if DEBUG
                // Run as interactive exe in debug mode to allow easy
                // debugging.

                var service = new MyService();
                service.OnStart(null);

                // Sleep the main thread indefinitely while the service code
                // runs in .OnStart

                Thread.Sleep(Timeout.Infinite);
#else
                // Run normally as service in release mode.

                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]{ new MyService() };
                ServiceBase.Run(ServicesToRun);
#endif
}

يمكنك أيضا بدء تشغيل الخدمة من خلال موجه الأوامر (sc.exe).

أنا شخصيا كنت تشغيل التعليمات البرمجية بذاتها البرنامج في مرحلة التصحيح ، عند معظم الحشرات تسويتها التغيير إلى تشغيل الخدمة.

ما اعتدت القيام به هو أن يكون سطر الأوامر التبديل الذي سيبدأ البرنامج إما خدمة أو تطبيق منتظم.ثم في IDE أود أن تعيين التبديل بحيث يمكن أن الخطوة من خلال قانون بلدي.

مع بعض اللغات يمكنك الكشف عن ما إذا كان قيد التشغيل في IDE ، وأداء هذا التبديل تلقائيا.

ما هي اللغة التي تستخدمه ؟

استخدام TopShelf المكتبة.

إنشاء تطبيق وحدة التحكم ثم تكوين الإعداد في الرئيسية

class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(x =>
            {

                // setup service start and stop.
                x.Service<Controller>(s =>
                {
                    s.ConstructUsing(name => new Controller());
                    s.WhenStarted(controller => controller.Start());
                    s.WhenStopped(controller => controller.Stop());
                });

                // setup recovery here
                x.EnableServiceRecovery(rc =>
                {
                    rc.RestartService(delayInMinutes: 0);
                    rc.SetResetPeriod(days: 0);
                });

                x.RunAsLocalSystem();
            });
        }
}

public class Controller
    {
        public void Start()
        {

        }

        public void Stop()
        {

        }
    }

لتصحيح الخدمة, فقط اضغط F5 في visual studio.

لتثبيت خدمة اكتب cmd "console.exe تثبيت"

يمكنك ثم بدء و إيقاف الخدمة في ويندوز مدير الخدمة.

أعتقد أن هذا يعتمد على ما هو نظام التشغيل الذي تستخدمه, Vista هو أصعب بكثير من أن نعلق على الخدمات بسبب الانفصال بين الدورات.

اثنين من الخيارات لقد استعملت في الماضي هي:

  • استخدام GFlags (في أدوات التصحيح لـ Windows) إلى الإعداد الدائم المصحح العملية.هذا موجود في "خيارات تنفيذ ملف الصورة" مفتاح التسجيل و هو مفيد بشكل لا يصدق.أعتقد أنك سوف تحتاج إلى قرص إعدادات الخدمة إلى تمكين "بالتفاعل مع سطح المكتب".يمكنني استخدام هذا لجميع أنواع التصحيح ليس فقط الخدمات.
  • الخيار الآخر هو فصل رمز قليلا حتى أن الخدمة جزء للتبادل مع التطبيق العادي بدء التشغيل.بهذه الطريقة, يمكنك استخدام سطر أوامر بسيطة العلم و إطلاق عملية (بدلا من الخدمة) ، مما يجعل من الأسهل بكثير أن التصحيح.

ويساعد هذا الأمل.

عندما أكتب خدمة أضع كل الخدمات المنطق في dll مشروع إنشاء اثنين "يستضيف" أن الدعوة إلى هذا dll واحد هو خدمة ويندوز والآخر هو تطبيق سطر الأوامر.

يمكنني استخدام تطبيق سطر الأوامر من أجل التصحيح و إرفاق مصحح أخطاء إلى خدمة حقيقية فقط عن الخلل لا أستطيع أن تتكاثر في تطبيق سطر الأوامر.

أنا كنت تستخدم هذا النهج فقط تذكر أن لديك لاختبار كل رمز في حين تعمل في خدمة حقيقية ، في حين سطر الأوامر أداة لطيفة التصحيح المعونة انها بيئة مختلفة وأنها لا تتصرف تماما مثل خدمة حقيقية.

أحب أن تكون قادرة على تصحيح كل جانب من جوانب الخدمة ، بما في ذلك أي التهيئة في OnStart () ، في حين لا يزال تنفيذ ذلك مع خدمة كاملة السلوك في إطار SCM...أي "وحدة التحكم" أو "التطبيق" واسطة.

أنا القيام بذلك عن طريق إنشاء خدمة ثانية في نفس المشروع إلى استخدام من أجل التصحيح.التصحيح الخدمة ، عندما بدأت كالعادة (أيفي MMC خدمات المساعد) ، ويخلق خدمة استضافة هذه العملية.هذا يتيح لك عملية إرفاق مصحح الأخطاء حتى لو لم بدأت خدمة حقيقية حتى الآن.بعد إرفاق مصحح أخطاء إلى عملية بدء خدمة حقيقية و يمكنك كسرها في أي مكان في دورة حياة الخدمة ، بما في ذلك OnStart().

لأنه يتطلب الحد الأدنى للغاية قانون التسلل ، debug الخدمة يمكن بسهولة أن تكون في خدمة المشروع الإعداد بسهولة إزالتها من الإنتاج الخاص بالإفراج عن طريق التعليق الخروج سطر واحد من التعليمات البرمجية وحذف مشروع واحد مثبت.

التفاصيل:

1) على افتراض أنك تنفيذ MyService, أيضا إنشاء MyServiceDebug.إضافة إلى ServiceBase مجموعة في Program.cs مثل ذلك:

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new MyService(),
            new MyServiceDebug()
        };
        ServiceBase.Run(ServicesToRun);
    }

2) إضافة خدمة حقيقية التصحيح و خدمة المشروع المثبت من أجل خدمة المشروع:

enter image description here

كل الخدمات (الحقيقي و التصحيح) الحصول على المدرجة عند إضافة خدمة إخراج المشروع إلى إعداد مشروع الخدمة.بعد التثبيت ، سواء الخدمات سوف تظهر في الخدمة.msc MMC المساعد.

3) بدء التصحيح الخدمة في MMC.

4) في Visual Studio إرفاق مصحح الأخطاء في عملية بدأت قبل التصحيح الخدمة.

5) بدء الخدمة الحقيقية والتمتع التصحيح.

عند تطوير وتصحيح خدمة ويندوز أنا عادة تشغيل تطبيق وحدة التحكم عن طريق إضافة /وحدة التحكم المعلمة بدء التشغيل والتحقق من هذا.يجعل الحياة أسهل بكثير.

static void Main(string[] args) {
    if (Console.In != StreamReader.Null) {
        if (args.Length > 0 && args[0] == "/console") {
            // Start your service work.
        }
    }
}

ماذا عن المصحح.كسر() في الصف الأول ؟

لتصحيح خدمات Windows أنا الجمع بين GFlags و .reg ملف تم إنشاؤه من قبل regedit.

  1. تشغيل GFlags تحديد exe اسم vsjitdebugger
  2. تشغيل regedit ثم انتقل إلى الموقع حيث GFlags يحدد خياراته
  3. اختر "تصدير مفتاح" من قائمة ملف
  4. حفظ هذا الملف في مكان ما .امتداد reg
  5. في أي وقت كنت ترغب في تصحيح الخدمة:دبل كليك على .reg
  6. إذا كنت ترغب في إيقاف التصحيح, دبل كليك على الثاني .reg

أو حفظ التالية قصاصات محل servicename.exe المطلوب الاسم القابل للتنفيذ.


debugon.ريج:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\servicename.exe]
"GlobalFlag"="0x00000000"
"Debugger"="vsjitdebugger.exe"

debugoff.ريج:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\servicename.exe]
"GlobalFlag"="0x00000000"

الروتينية الصغيرة الاشياء البرمجة فعلته خدعة بسيطة جدا بسهولة تصحيح الخدمة:

على بدء الخدمة, أنا تحقق معلمة سطر الأوامر "/debug".إذا كان هو مع هذه المعلمة لا تفعل الخدمة المعتادة بدء التشغيل, ولكن بدلا من ذلك تبدأ جميع المستمعين فقط عرض messagebox "التصحيح في التقدم ، اضغط "موافق " لإنهاء".

حتى إذا بدء تشغيل خدمة بالطريقة المعتادة ، وسوف تبدأ الخدمة ، إذا كانت بدأت مع سطر الأوامر المعلمة /التصحيح وسوف تتصرف مثل برنامج عادي.

في مقابل أنا فقط إضافة /debug كما التصحيح المعلمة وبدء برنامج الخدمة مباشرة.

بهذه الطريقة يمكن بسهولة تصحيح معظم صغيرة نوع من المشاكل.بالطبع, بعض الأشياء لا تزال وسوف تحتاج إلى تصحيحه الخدمة ، ولكن 99% هذا هو جيدة بما فيه الكفاية.

#if DEBUG
    System.Diagnostics.Debugger.Break();
#endif

يمكنني استخدام الاختلاف على JOP الجواب.استخدام معلمات سطر الأوامر يمكنك تعيين وضع التصحيح في IDE مع خصائص المشروع أو من خلال خدمة Windows manager.

protected override void OnStart(string[] args)
{
  if (args.Contains<string>("DEBUG_SERVICE"))
  {
    Debugger.Break();
  }
  ...
}

عن المتاعب-اطلاق النار على القائمة خدمة Windows برنامج استخدام مصحح الأخطاء.كسر()' كما الرجال المقترحة.

جديد خدمة Windows برنامج, أود أن أقترح استخدام جيمس مايكل هير طريقة http://geekswithblogs.net/BlackRabbitCoder/archive/2011/03/01/c-toolbox-debug-able-self-installable-windows-service-template-redux.aspx

ضع المصحح الغداء في أي مكان و نعلق Visualstudio على بدء التشغيل

#if DEBUG
    Debugger.Launch();
#endif

أيضا عليك أن تبدأ VS Administatrator و تحتاج إلى السماح أن العملية يمكن أن يكون تلقائيا تصحيحه من قبل ديفرينت المستخدم (كما هو موضح هنا):

reg add "HKCR\AppID{E62A7A31-6025-408E-87F6-81AEB0DC9347}" /v AppIDFlags /t REG_DWORD /d 8 /f

استخدام خدمة Windows قالب C# مشروع إنشاء خدمة جديدة من التطبيق https://github.com/HarpyWar/windows-service-template

هناك وحدة التحكم/وضع الخدمة تلقائيا الكشف عن السيارات المثبت/deinstaller من خدمة عدة الأكثر استخداما هي الميزات المضمنة.

هنا هو طريقة بسيطة التي اعتدت على اختبار الخدمة ، دون أي إضافية "تصحيح" أساليب متكاملة مقابل وحدة الاختبارات.

[TestMethod]
public void TestMyService()
{
    MyService fs = new MyService();

    var OnStart = fs.GetType().BaseType.GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

    OnStart.Invoke(fs, new object[] { null });
}

// As an extension method
public static void Start(this ServiceBase service, List<string> parameters)
{
     string[] par = parameters == null ? null : parameters.ToArray();

     var OnStart = service.GetType().GetMethod("OnStart", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

     OnStart.Invoke(service, new object[] { par });
}
static class Program
{
    static void Main()
    {
        #if DEBUG

        // TODO: Add code to start application here

        //    //If the mode is in debugging
        //    //create a new service instance
        Service1 myService = new Service1();

        //    //call the start method - this will start the Timer.
        myService.Start();

        //    //Set the Thread to sleep
        Thread.Sleep(300000);

        //    //Call the Stop method-this will stop the Timer.
        myService.Stop();

         #else
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1() 
        };

        ServiceBase.Run(ServicesToRun);
         #endif
    }
}

لديك خياران للقيام التصحيح.

  1. إنشاء ملف السجل :أنا شخصيا أفضل سجل منفصل ملف مثل ملف نصي بدلا من استخدام التطبيق تسجيل الدخول أو سجل الأحداث.ولكن هذا سوف يكلفك الكثير نيابة عن الوقت, لأنه لا يزال من الصعب معرفة لنا أين الخطأ بالضبط الموقع
  2. تحويل التطبيق إلى تطبيق وحدة التحكم :هذا وسوف تتيح لك جميع أدوات تصحيح الأخطاء التي يمكن أن نستخدمها في مقابل.

يرجى الرجوع هذا بلوق وظيفة التي تم إنشاؤها لهذا الموضوع.

فقط لصق

Debugger.Break();

في أي مكان في التعليمات البرمجية.

على سبيل المثال ،

internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        private static void Main()
        {
            Debugger.Break();
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new Service1()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }

وسوف تصل Debugger.Break(); عند تشغيل البرنامج الخاص بك.

الخيار الأفضل هو استخدام 'النظام.التشخيص'مساحة الاسم.

أرفق الكود الخاص بك إذا كان في آخر كتلة من أجل وضع التصحيح و وضع الإصدار كما هو مبين أدناه للتبديل بين التصحيح و وضع الإصدار في visual studio ،

#if DEBUG  // for debug mode
       **Debugger.Launch();**  //debugger will hit here
       foreach (var job in JobFactory.GetJobs())
            {
                //do something 
            }

#else    // for release mode
      **Debugger.Launch();**  //debugger will hit here
     // write code here to do something in Release mode.

#endif
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top