Selam! Bir aydır yazı yazmıyordum. Bir aylık bir aradan sonra yazılarıma dönüş yapmayı düşünüyorum. Bu yazımda C# Windows Servis Hazırlama ve Yükleme konusunu anlatmaya çalışacağım. Geçenlerde bir projemde bir log tutma işlemi için windows servis hazırlamam gerekti. Aslında ilk etapta serverde çalışan bir exe olarak düşünmüştüm ama biran aklıma servis konusu geldi. Bende daha önce çok fazla uğraşmamıştım. Biraz uğraştıktan sonra başardım ve yazısını yazmak istedim. Öncelikle Windows servis nedir? ona bir bakalım.
Windows Servis Nedir?
Windows Hizmetleri, arka planda çalışan UI (görsel ekranları) olmayan yazılım uygulamalarıdır. Windows hizmetleri genellikle bir işletim sistemi önyüklendiğinde başlatılır ve bazı görevleri yürütmek için arka planda çalışacak şekilde programlanır. Windows hizmetleri de otomatik veya manuel olarak başlatılabilir. Windows hizmetlerini manuel olarak da duraklatabilir, durdurabilir ve yeniden başlatabilirsiniz.
Windows hizmeti, bazı görevleri yerine getirmek için arka planda çalışan bir bilgisayar programıdır. Windows hizmetlerinin bazı örnekleri, otomatik Windows güncellemesi, e-postaları kontrol etme, belgeleri yazdırma, SQL Server aracısı, dosya ve klasör tarama ve indeksleme vb. Görev Yöneticinizi açıp Hizmetler sekmesine tıklarsanız, makinenizde çalışan yüzlerce hizmet göreceksiniz. Ayrıca bu hizmetlerin durumlarını da görebilirsiniz. Bazı hizmetler çalışıyor, bazıları duraklatıldı ve bazıları durdu. Buradan hizmete sağ tıklayarak bir hizmeti başlatabilir, durdurabilir ve duraklatabilirsiniz.
- Denetim Masası’na gidin, “Yönetim Araçları” içinde “Hizmetler” i seçin.
- Çalıştır penceresini (Windows + R) açın ve services.msc yazın ve ENTER tuşuna basın.
C# Windows Servis Hazırlama ve Yükleme
C# Windows Servis Hazırlama
Visual Studio’yu açalım ve yeni bir proje başlatalım. Projemiz bir Windows Service(.Net Framework) olacak. Ben VS2019 kullanıyorum. Siz daha eski bir sürüm kullanıyorsanız New Project ekranı farklı olacaktır.
Next dediğimizde proje adını yazacağımız ekran gelecek. Projenin adını da istediğinizi yazabilirsiniz. (İsim kurallarına uyarak tabi ki )
Proje açıldığında karşımıza böyle bir ekran gelecek.
Boş bir alanda sağ tık yapıyoruz ve “Add Installer” diyoruz.
Installer’ı ekledikten sonra ProjectInstaller projemize eklenecek ve ProjectInstaller.cs dosyası açılacaktır.
Her şeyi kaydetmeyi unutmayın (ctrl + shift + s tuşlarına ile)
Bu ekrana geldikten sonra boş alanda sağ tık yapıp “View Code” diyoruz.
Şimdi kod kısmına geçelim.
Çok Önemli: InitializeComponent yönteminin çağrılmasından önce hiçbir yöntemi çağırmayı denemeyin.
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
Ayrıca açıklama ekleyebilir ve hizmet adını görüntüleyebilirsiniz (isteğe bağlı olarak).
this.serviceInstaller1.Description = "İlk Servis Demo"; this.serviceInstaller1.DisplayName = "IlkServis.Demo";
Şimdi ayarlarımızı yaptığımıza göre servis çalıştığında yapacağı şeyleri yazalım. Bu adımda, hizmeti belirli bir zamanda aramak için bir zamanlayıcı ve kod uygulayacağız. Bir metin dosyası oluşturacağız ve servisi kullanarak metin dosyasına geçerli saati yazacağız. Kodlarımız aşağıdaki gibi olacak.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; using System.Timers; namespace MyFirstService { public partial class Service1: ServiceBase { Timer timer = new Timer(); // name space(using System.Timers;) public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { WriteToFile("Service is started at " + DateTime.Now); timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); timer.Interval = 5000; //number in milisecinds timer.Enabled = true; } protected override void OnStop() { WriteToFile("Service is stopped at " + DateTime.Now); } private void OnElapsedTime(object source, ElapsedEventArgs e) { WriteToFile("Service is recall at " + DateTime.Now); } public void WriteToFile(string Message) { string path = AppDomain.CurrentDomain.BaseDirectory + "\\Logs"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string filepath = AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\ServiceLog_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt"; if (!File.Exists(filepath)) { // Create a file to write to. using(StreamWriter sw = File.CreateText(filepath)) { sw.WriteLine(Message); } } else { using(StreamWriter sw = File.AppendText(filepath)) { sw.WriteLine(Message); } } } } }
Kodlarımızı açıklamamız gerekirse;
Yukarıdaki kod her 5 saniyede bir servisi çalıştırarak ve eğer verdiğimiz yolda bir klasör yoksa bir klasör oluşturacak ve metin belgesine mesajımızı yazacaktır.
Kodları da yazdıktan sonra projemizi build edeceğiz ve servis yüklenmeye hazır hale gelecektir.
C# Windows Servis Yükleme
Şimdi Başlat’a geliyoruz ve CMD ekranını yönetici olarak açıyoruz. Servis kurabilmemiz için ek bir program kullanacağız ama zaten bu program .Net Framework’un kendi programıdır. O yüzden bir program kurmamıza gerek yok.
CMD’yi yönetici olarak açtıysanız aşağıdaki kodu yazın. Eğer Win 10 kullanıyorsanız kopyalayıp yapıştırabilirsiniz.
cd C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
Genelde bu yol doğru oluyor ama siz yine de bir doğruluğunu kontrol edin.
Şimdi projenizin Bin\Debug klasörüne gidin ve servis exe dosyasını istediğiniz bir yere koyun. Burada dikkat etmeniz gereken kısım izinler olması gerekiyor. Ayrıca servisi kurduğunuzda yerini değiştirmeniz sorun olacaktır. Bu yüzden tekrar kaldırmanız gerekmeyecek bir klasöre atmanızı tavsiye ederim. Ben müşterimde C:\\Windows\System içerisine atıp kurmuştum.
CMD ekranında yukarıda verdiğim klasöre girdiyseniz şimdi çalışma kodumuzu yazabiliriz.
Yazacağımız kod formatı şöyle
InstallUtil.exe + Kopyalanan yol + \ servis adı + .exe
InstallUtil.exe yazdıktan sonra boşluk bırakıp servisin tam yolunu yazıyoruz. (Nerede olduğu adı ve uzantısı)
Örneğin;
InstallUtil.exe C:\Windows\System\WindowsService1.exe
Kurulum başarı ile tamamlanırsa aşağıdaki mesajı alırsınız.
Microsoft (R) .NET Framework Yükleme Yardımcı Programı Sürüm 4.7.3062.0
Telif Hakkı (C) Microsoft Corporation. Tüm hakları saklıdır.İşlem temelli olan yükleme çalıştırılıyor.Yüklemenin Yükleme aşaması başlıyor.
C:\Windows\System\WindowsService1.exe derlemesinin ilerleyişi için günlük dosyası içeriğine bakın.
Dosya C:\Windows\System\WindowsService1.InstallLog konumunda.
‘C:\Windows\System\WindowsService1.exe’ derlemesi yükleniyor.
Etkilenen parametreler şunlardır:
logtoconsole =
assemblypath = C:\Windows\System\WindowsService1.exe
logfile = C:\Windows\System\WindowsService1.InstallLog
WindowsService1 hizmeti yükleniyor…
WindowsService1 hizmeti başarıyla yüklendi.
Application günlüğünde WindowsService1 EventLog kaynağı oluşturuluyor…Yükleme aşaması başarıyla tamamlandı, Tamamlama aşaması başlıyor.
C:\Windows\System\WindowsService1.exe derlemesinin ilerleyişi için günlük dosyası içeriğine bakın.
Dosya C:\Windows\System\WindowsService1.InstallLog konumunda.
‘C:\Windows\System\WindowsService1.exe’ derlemesi tamamlanıyor.
Etkilenen parametreler şunlardır:
logtoconsole =
assemblypath = C:\Windows\System\WindowsService1.exe
logfile = C:\Windows\System\WindowsService1.InstallLogTamamlama aşaması başarıyla tamamlandı.
İşlem temelli olan yükleme tamamlandı.
Bu mesajı gördüyseniz kurulum başarı ile tamamlanmıştır. Eğer bir hata varsa yine CMD ekranında hatanın ne olduğunu size göstermektedir.
Artık servisler ekranına gidip servisimizi başlatabiliriz.
C# Windows Servis Hazırlama ve Yükleme dersimiz de bu kadardı arkadaşlar. Diğer derslerimizde görüşmek üzere…
C# Eğitim Seti sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bağlantıdan ulaşabilirsiniz… Bu dersim projesini githuba yükleyemedim. Bu sebeple drive üzerinden paylaşıyorum.
Buradan indirebilirsiniz.
Birebir aynısı yaptığınız halde çalıştıramadıysanız yukarıdan projeyi indirip öyle deneyin. İlk denemelerimde bende bir türlü çalıştıramamıştır.
Sağlıcakla ve takipte kalın. ;)
453. Yazı Bitti… :)
Merhaba Mustafa emeğine sağlık.
Cmd yi yönetici çalıştırdığında yetki hatası alınmıyor. Tek seferde çalıştı teşekkür ederim.
Merhaba,
Çok sevindim ve güzel yorumun içinde teşekkür ediyorum.
Derslerin %99 ‘unu bizzat deneyip çalıştığından emin olup yüklüyorum.
Merhabalar mustafa bey elinize saglık..
Ben C# da sıfırdan class yazarak bileşen olusturmayı araştırıyorum fakat hiçbir yerde bir kaynak bulamadım. Bu konu hakkında bilginiz varmıydı? yardımcı olabilirmisiniz?
Merhabalar,
Bu yazımda kendimize özel sadece sayı girişi yapılabilen bir textbox yapmıştık. Aradığınız konu bu.
https://mustafabukulmez.com/2020/06/22/c-sadece-sayi-girisi-icin-ozellestirilmis-textbox-yapmak/
İyi Çalışmalar dilerim.