Windows Service Projesini Debug Etme ve Harici Exe Çalıştırma
Husamettin Elalmis
Merhaba arkadaşlar, bu yazıda sizlere Windows Service Projeini Debug etme ve service içerisinden harici exe çalıştırma yönteminden bahsedeceğim.
Windows Service nedir?
Windows Service, geri planda işletim sistemi üzerinde çalışır, "services" komutu ile çalışan servisleri görebiliriz
Windows Service, .net ortamında geliştirilebilen bir proje türüdür.


Windows Service'in Install Edilmesi (Sisteme Tanıtılması)
Projemizi "release" modda build ettikten sonra aşağıdaki folder yapısına benzer bir görünüm elde ederiz

Administrator olarak CommandPromptu açarız ilgili klasöre cd komutu ile gideriz
sc create Easy2PatchService binpath="C:\Projects\Arge\ArkSoft\Tumark\TumarkClientService\bin\Release\TumarkClientService.exe" komutu ile servisi sisteme kurmuş oluruz (servisi services modül listesinden focuslanıp manuel olarak elle başlatmamız gerekmektedir, default olarak manuel kurulur)
Not: sc komutunun alternatifi "installutil.exe" komutudur. İkisi de aynı kapıya çıkar. Aralarında çok hafif farklar vardır. Sc komutu daha çok tercih ediliyor.
Bu işlemler için .bat dosyası kullanıyorum, cs.bat (createService.bat) bu komutu otomatik olarak çalıştırmaktadır
Çalışan servisi komut satırından durdurmak için
sc stop Easy2PatchService komutunu gireriz
Durdurulmuş servisi komut satırından kaldırmak için (servisin önce durdulmuş olması gerekmektedir)
sc delete Easy2PatchService komutunu gireriz
Stop ve Delete işlemini ard arda yapması için ds.bat (deleteService.bat) hazırladım, bu şekilde hızlıca kullanabiliyorum
Geliştirilen servis projelerinde release folder altında cs.bat ve ds.bat komutlarını hazırda bulundurmak iyidir, zaman tasarrufu sağlar
Windows Service Hakkında Bilinmesi Gerekenler
Bir service projesi, bünyesinde birden fazla service barındırabilir. Bu nedenle yeni oluşturulan bir service projesinde array şeklinde çalışmasının sebebi budur (birden fazla servisi yönetmek ve iş akışlarını parçalama amaçlı kullanmak üzere)
Servis projeleri, geri planda çalışır. Release modda olmak zorundadır.
Servisi runtime'da çalıştırabilmek için sisteme kurulması ve start edilmesi gerekmektedir.
Servis uygulamalarında, Winform UI elementleri kullanılamamaktadır (servis uygulamalarının UI ile bağlantı kurabilmesi mümkün olmamaktadır)
Normal şartlarda servis, dışarıdan bir harici uygulamayı çalıştıramamaktadır (Dışarıdan harici bir uygulamayı çalıştırmak için kullanılan Process.Run komutu, service accountunun scopu ile ilgili bir durumdur. Her durumda dışarıdan bir uygulamayı çalıştırma işlemi istersek kernel seviyesinde çalıştırabilmek mümkün olduğu görülmüştür. Process.Run komutu yeterli olmamaktadır.
Normal şartlarda, service projesi debug edilememektedir. Bu genel yaşanan bir sıkıntıdır. Ancak, reflection yöntemlerini kullanarak debug modda çalıştırmak mümkün olmaktadır. Bunun nasıl yapılabildiğini göstereceğim.
Helper Classlarının Hazırlanması
Windows service projemizde evladiyelik kullanabileceğimiz bazı helper classlarını önceden hazırlamış olmamız gerekmektedir, bunlardan temel olanları
Singleton classı : Classlarımıza singleton patternini uygulamak için kullanırız.
FileHelper classı: Bu projemizde dosyaya log yazdırmak için kullanırız.
ServiceHelper classı: Servisimizi debug modda çalıştırabilmek (kod iz sürmek ve akış takibi yapmak için) kullanırız
ProcessStart classı: Harici uygulamayı çağırabilmek için (kernel seviyesinde) kullanırız
Singleton Classı
FileHelper Classı
ServiceHelper Classı
ProcessHandler Classı
Output Ayarının Setlenmesi

Service projesinin outputtype tipi ConsoleApplication seçilir
Program.cs

Debug modda run (F5) yaptığımızda servisimizin OnStart başlangıç metoduna düştüğünü görebiliriz, F10-F11 tuş kombinasyonları ile adım adım kod iz sürülebilir
Böylece, mevcut methodların debug için ayrı, release için ayrı kopyalarını çıkartmak zorunda kalmıyoruz
Release modda çalıştırıp, eventViewer loglarına girdilerin yapılıp hangi değer neymiş gibi bakmamıza gerek kalmayacak.
Kod daha stabil hale gelmiş olacak, debugda çalışan bir akışın releaseda da çalışıyor olmasını bekliyor olacağız
Service1.cs
Sonuç
Burada bahsi geçen kodların tamamı örnek proje yapılarak uygulanmış ve hem debug hem release modda çalıştığı görülmüştür
Bu projedeki arge şunu hedeflemiştir,
Service uygulaması kod seviyesinde Debug edilebilsin
MFA simulasyonu yapabilsin (service dışarıdaki bir harici uygulamayı çalıştırabilsin)
Çalıştırılan harici uygulamadaki keyboard eventslar argelenebilsin (tuş takımı kilitlemeleri vb.)
Lock ve Unlock durumlarını algılasın, Unlock yapıldığında MFA formu ekrana gelsin vb.
Windows Service projelerinde burada bahsi geçen temel bilgileri ve helper classlarını standard halde kullanabiliriz (Easy2Patch projesinde bu şekilde kullandım, sessionLimit ve diğer servislerde de aynı yapı kullanılabilir)
Saygılarımla,
Hüsamettin ELALMIŞ – 07.08.2021
Last updated