Windows servislerinde hata ayıklaması

Şimdi efendim bilen bilir, Maykrosoft Visual Studio.NET ile çalışırken, bir windows service yazdığınızda, yazdığınız servis üzerinde hata ayıklaması yapamıyorsunuz normal koşullarda. Yok efendim neymiş Windows Servislerinde debugging yapılmazmış, mıy mıy mıy, bok püsür. Tipik Maykrosoft davranışı 🙂

Eee böyle bir durumda da yazılımcılar gayet zorluk yaşıyorlar, yazdıkları servisin nasıl davrandığını test edemiyorlar, hata ayıklaması yapamıyorlar. Dolayısıyla bu da ortaya çıkacak olan servisin, uygulamanın gecikmesine neden oluyor.

Şimdi efenim peki biz bu sorunu nasıl aşıcaz? Şöyle ki,

Visual Studio.NET’te bir Windows Service projesi oluşturduğunuzda, şablon olarak karşınıza Main() metodu aşağıdaki gibi bir şablonla gelecek.

// The main entry point for the process
static void Main()
{
    System.ServiceProcess.ServiceBase[] ServicesToRun;
 
    // More than one user Service may run within the same process. To add
 
    // another service to this process, change the following line to
 
    // create a second service object. For example,
 
    //
 
    // ServicesToRun = new
 
    //      System.ServiceProcess.ServiceBase[] {new Service1(),
 
    //      new MySecondUserService()};
 
    //
 
    ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() };
    System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}

ve siz de bu şablon üzerinden servisinizi yazmaya başlayacaksınız ama servisinizi debug

edemeyeceksiniz. Bunun için Main() metodunda aşağıdaki gibi ufak bir değişiklik yapmanız gerekiyor.

// The main entry point for the process
static void Main()
{
#if (!DEBUG)
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
#else
// Debug kodu: bu kısım process'in servis olarak çalışmasını önler
 
// Servisin başlangıç metodunu çalıştıracak ancak processi hiçbir zaman öldürmeyecek
 
// Çıkmak için debugger'ı kapatmanız gerekiyor
 
Service1 service = new Service1();
service.<Servisinizin birincil metodunu buraya yazın>();
// Aşağıdaki satırın önüne bir breakpoint koyarak servisinizin
// hemen bitişinde onu yakalayabilirsiniz
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#endif
}

Bir windows servisini debug etmek için C# direktiflerini kullanarak servisin debug modunda farklı bir kodu, release modunda farklı bir kodu çalıştırmasına olanak sağlıyoruz. Yukarıda kırmızı olarak yazılmış “Servisinizin birincil metodunu buraya yazın” kısmına da yazdığımız ilgili servise ait, kendimizin oluşturduğu bir metotu çağırıyoruz. Hepsi bu kadar işte 🙂

iyi kodlamalar

,

2 Responses to Windows servislerinde hata ayıklaması

  1. Hüseyin Vural 30 Mayıs 2011 at 3:11 PM #

    Merhaba
    windows service ile ilgili bir problemim var
    Umarım yanıtlarsını.
    WS de Try komutunu kullandıktan sonra Hata alındığında service kendini
    otomotik olarak stop a alıyor.
    Böyle yapmasını tercih etmiyorum.
    Tekrar deneyip Hatayı txt dosyasına yazması istiyorum.
    Hatayı yazıyor arkasındadda Service kapatıyor.
    Buda normal bir kapatma değil.
    Kapandığı zaman (onstop) mail göndermesini istiyorum.
    Fakat göndermiyor. Çünkü normal bir kapanma işlemi olmadığı anlaşılıyor.
    Kendim Stop moduna aldığımda mail hesabıma geliyor.
    Umarım yardımcı olursunuz
    Selamlar

  2. Ahmet BÜTÜN 30 Mayıs 2011 at 3:37 PM #

    Örnek kod gönderebilir misin Hüseyin?

Bir cevap yazın

Font Resize