C# Ile Windows Service Projesi Oluşturma, Debug Etme Ve Setup Hazırlama

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 10

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

C# ile Windows Service projesi oluşturma, kodlama, yapılandırma (konfigürasyon), derleme, servisi bilgisayara (sunucuya)
yükleme (install) ve kaldırma (uninstall), Windows Service projesini debug etme ve projeyi Setup haline getirme işlemlerini
öğrenelim.
.NET WINDOWS SERVICE
Windows servisler, arka planda çalışan, bir arayüze sahip olmayan, start-type özelliği otomatik olarak ayarlandığında, sunucunun
yeniden başlatılması durumunda, kendiliğinde çalışan, çalışması için sunucuya login olmayı gerektirmeyen ve işleri otomatik olarak
yapan, son derece kullanışlı uygulamalardır.
Örneğin, belli aralıklarla peryodik olarak veya bazı uyarılarla uyarı anında; sistem üzerinde veya veritabanı üzerinde işlemler
yapılması, veya diğer uygulamalar ile çeşitli şekillerde (örneğin web servis aracılığı ile) bağlantı kurulması istendiğinde, en uygun
çözüm yöntemlerinden birisi windows servisler olacaktır.
Şimdi, .Net ile bir servis uygulamasının ne şekilde oluşturulduğunu, nasıl debug edildiğini ve uygulamaya nasıl alındığını
detaylarıyla görelim.
PROJE OLUŞTURMA

Şekil 1
Yukarıda şekil 1 ile gösterildiği gibi “File > New > Project” menüsüne tıklayarak, altta şekil 2 ile gösterilen yeni proje (New
Project) ekranını açın.

Şekil 2
Şekil 2 ile gösterilen ekranda, Visual C# > Windows menüsünü seçin. Açılan şablonlardan (teplates) “Windows Servis” proje tipini
seçin. “Name”, “Location” ve “Solution name” bilgilerini girdikten sonra “OK” butonuna basarak projeyi oluşturun.
Not: Çalışmak istediğiniz “framework”ü listeden seçmeyi unutmayın.
Proje oluşturulduktan sonra çalışmak istediğiniz “framework”ü değiştirmek için, “Solution Explorer” penceresinde bulunan projeye
sağ tıklayıp, açılan menüden“Özellikler (Properties)” menüsü tıklayarak, ya da, proje seçiliyken “Alt + Enter” tuşlayarak, proje
özellikleri sayfasını açın. Burada, sol tarafta bulunan “Application” sekmesindeki “Target framework” aracılığı ile, framework
sürümü değiştirilebilir. Bknz.Şekil 3
Şekil 3
 
KODLAMA
Proje oluştuktan sonra, “Soluton Explorer” penceresi şekil 4 ile gösterildiği biçimde olacaktır.

Şekil 4
“Service1.cs” dosyasını seçerek, klavyeden F7 tuşuna bastığınızda, servise ait kod sayfası açılacaktır. Kod sayfası altta şekil 5 ile
gösterilmiştir.

Şekil 5
Yukarıdaki şekilde de görüldü gibi, servise ait 2 adet event otomatik olarak gelir. “OnStart” eventi, servis çalıştırıldığında devreye
girerken, “OnStop” eventi servis durdurulduğunda devereye girer. “OnStart” eventinde bulunan “args” parametresi sayesinde,
servisi çalıştırma esnasında parametre geçilebilir. Bu şekilde, servis, anlık olarak farklı parametreler ile çalıştırılabilir.
Şimdi, bu iki eventi kullanarak ne şekilde servis programlaması yapıldığını inceleyelim.
Bir windows servis içinde sadece bir tek iş yapılabileceği gibi, birden fazla iş yapılması da istenebilir. Servis başlatıldığında sadece
bir tek iş yapılacak ve o iş bittikten sonra servisin işi bitmiş olacak ise, “OnStart” eventinin içinde bir method çağrısı yapılması
yeterlidir. Ancak, genellikle istenen, servisin belli peryotlarda, belirlenen işleri paralel olarak yapmasıdır. Bu nedenle, öncelikle
servisin belli zaman dilimlerinde veya gelen belli uyarılarla işlem yapması temin edilmelidir. Sonra da, birden fazla iş yapılacak ise,
bu işlerin paralel şekilde yapılması sağlanmalıdır.
Servisimiz belli zaman dilimlerinde belirlenen işleri yapacak ise, en uygun yöntem bir zamanlayıcı (timer) tınımlamaktır.
Servisimiz, kendisine gelecek olan uyarıları dinleyecek ve bu uyarılara göre bazı işleri yapacak ise, bu durumda, uygun yöntem
sonsuz bir döngü içinde kalıp uyarıları dinlemek olacaktır. Dinlenecek uyarılar, bir seri ya da paralel porttan gelebileceği gibi,
ethernet’ten, USB portundan ya da bilgisayar üzerindeki herhangi bir aygıttan gelebilir.
Biz örenğimizde, en çok kullanılan durum olan, belli peryotlar ile birden fazla işlemin yapılması durumunu ele alacağız.
Şimdi öncelikle, istenen zaman dilimlerinde olup olmadığımızı kontrol edeceğimiz bir zamanlayıcı (timer) oluşturulam. Burada
bilnmesi gereken en önemli noktalardan birisi şudur. Windows servis yazarken, Visual Strudio’nun tools penceresinden, sürükle-
bırak ile herhangi bir kontrolün eklenemeyeceğidir. Özellikle, görsel kontrollerin hiçbirisi windows servis üzerinde oluşturulamaz.
Ama, görsel olmayan kontroller, kodsal olarak oluşturulup kullanılabilir. Biz de, görsel olmayan zamanlayıcımızı alttaki şekilde
oluşturacağız.

Şekil 6
Şekil 6 ile gösterildiği gibi, “Tmr1” isimli bir zamanlayıcı oluşturuldu. Zamanlayıcının sınıf (class) sevisinde tanımlanmasının
nedeni, class içindeki herhangi bir method içinde kontrol edilebilmesini sağlamak. İhtiyacınıza göre, siz zamanlayıcıyı method
içinde de tanımlayabilirsiniz.
Daha sonra, servisin “OnStart” eventi içinde zamanlayıcı için bir örnek (instance) oluşturuluyor ve bazı özellikleri belirleniyor.
Örneğin, zamanlayıcının hangi peryotlarda devreye gireceği “Interval” özelliğine milisaniye cinsinden bir değer verilerek
belirleniyor. Örneğimizde, bu değer 60000, yani 1 dk.olarak belirlenmiştir. Ardından da zamanlayıcı “Start()” methodu çağrılarak
çalıştırılıyor.
Dikkat edilirse son satırda bir event tanımlaması yapılmıştır. Bu şekilde, zamanlayıcı devreye girdiğinde hangi event’in
tetikleneceği belirlenmiştir. Bizim örneğimizde, zamanlayıcının tetikleyeceği event
“private void Tmr1_Elapsed(object sender, EventArgs e)” şeklinde verilmiştir. Bu event içine gerekli kodlar yazılarak, istenen
işlemler yaptırılabilir.
Zamanlayıcımız devreye girdiğinde, gerekli işleri yapacak birden fazla methodun, paralel (Multi-Thread) olarak nasıl çalıştırılacağı
altta şekil 7 ile verilen kod örneğinde gösterilmiştir.

Şekil 7
Yukarıdaki şekilde de görüldüğü gibi, önce işlem için ilgili zamanın gelip gelmediği kontrol ediliyor. Zaman gelmiş ise, birbirinden
farklı iki ayrı method paralel olarak devreye sokuluyor. Bu noktadan sonra artık bu iki method paralel olarak çalışacak ve istenen
işleri yapacaktır.
Servis içinde birden fazla zamanlayıcı kullanılabilir ve her bir zamanlayıcının birden fazla methodu paralel (multi-thread) olarak
çalıştırması sağlanabilir. Burada dikkat edilmesi gereken konulardan birisi, zamanlayıcılar devreye girip ilgili methodları aktive
ettikten sonra, zamanlayıcıların çalışmaya devam edip etmeyeceğine karar vermektir. Zamanlayıcıların method çağrılarını yaptıktan
sonra durması isteniyor ise, “Enabled” özelliği “false” yapılmalıdır. Ancak, zamanlayıcının işlem bittikten sonra tekrar çalışmaya
başlaması için uygun yerde bu değerin tekrar “true” yapılması gerekir.
YAPILANDIRMA
Servisi “app.config” aracılığı ile konfigüre edebilirsiniz. Bu şekilde, koda müdahele etmeden pek çok parametreyi değiştirip,
servisin çalışma şekline müdahele edebilirsiniz. Bunun için, servisi durdurup, ilgili config dosyası içinde istediğiniz değişikliği
yapıp, ardından servisi tekrar çalıştırmanız yeterli olacaktır. Örneğin, veritabanı bağlantısı için “connectionStrings” tag’i ve bazı
parametreleriniz için “appSettings” tag’i, şekil 8 ile gösterildiği şekilde eklenebilir.

Şekil 8
DERLEME
Proje derlendiğinde, “Debug” klasörü altında bazı dosyalar oluşturulur. Oluşturulan dosyalar şekil 9 ile gösterilmiştir. Eğer
projenize başka bazı referanslar eklenmiş ise, o nesneler de bu dizinde görünecektir. Örneğin, veritabanı işini yapan “DAL.dll”
isimli bir nesnemiz varsa ve referans edilmiş ise, bu durumda alttaki şekilde gösterilen listeye “DAL.dll” dosyası da eklenecektir.

Şekil 9
Burada önemli olan ilk üç dosyadır. İlki, bizim çalıştıracağımız “exe” dosyası; ikincisi, ayarlarımızın olduğu “config” dosyası ve
üçüncüsü, debug işlemlerinde kullanılacak olan “pdb” dosyasıdır. Remote debug yapılmak istendiğinde, proje debug modda
derlenerek kurulmalı ve uygulama dizini altına pdb uzantılı dosyalar elle atılmalıdır. Remote Debug ile ilgili detay bilgi için,
“Remote_Debugging” konusunda daha önce yazmış olduğum makaleye bakabilirsiniz.
YÜKLEME (INSTALL)
Windows servis projeleri, windows forms veya web projeleri gibi doğrudan çalıştırılarak debug edilemez. Servisin öncelikle Install
edilip çalıştırılması gerekir. Install işlemi için:
Projedeki “Service1.cs” isimli servis dosyasına çift tıklayın. Altta şekil 10 ile gösterilen ekran görüntülenecektir.

Şekil 10
Açılan ekrandaki boş bir alana mouse sağ tuşu ile tıklayın ve açılan menüden “Add Installer”a tıklayın. Bknz.Şekil 11.

Şekil 11
Daha sonra, altta şekil 12 ile gösterilen ekran açılacaktır.

Şekil 12
Ekrandaki “serviceInstaller1”e mouse sağ tuşu ile tıklandığında çıkan menüde “Properties”i seçin. Şekil 13 ile gösterildiği biçimde
bir pencere açılacaktır.

Şekil 13
1. DelayedAutoStart: Bu alanın öntanımlı (default) değeri “false” şeklindedir. Bu değer “true” yapıldığında, “StartType”
özelliği “Automatic” seçilmiş ise veya servisin başlama tipi sonradan “Automatic” olarak değiştirilmiş ise; servis,
sunucunun restart olması durumunda otomatik, ama bir miktar gecikmeli olarak başlar. Bu seçenek, servisiniz, daha önce
başlamasını beklediğiniz bir başka servise bağlı olduğunda seçilebilir, kullanılışlı bir özelliktir.
2. Description: Bu kısıma servisinizin ne iş yaptığı ile ilgili kısa bir açıklama girebilirsiniz.
3. DisplayName: Bu alana yazacağınız isim, “Services” listesinde görünecek olan isimdir. O nedenle, var olan bir servis ismi
vermemeye ve ilk bakışta ne ile ilgili olduğunu anlatmaya yetecek bir isim seçilmesinde fayda vardır. (Biz örneğimizde bu
alana “WinSvcDemo” ismini vereceğiz).
4. ServiceName: Bu alana yazılan isim, “Services” listesinde bulunan servisinizin “Properties” sayfasını açtığınızda, o
sayfadaki “Service Name” kısmında görünecek olan isimdir.
5. ServicesDependedOn: Servisinizin başka servislere bağımlılığı varsa, bu alana o servislerin isimleri girilir. Bu durumda,
bu alana girdiğiniz servisler çalışmaya başlamadan, sizin servisiniz çalışmaya başlamaz.
6. StartType:
a. Automatic: Servisiniz otomatik olarak başlar.
b. Manuel: Servisinizi “Services” listesine giderek kendiniz elle başlatmak zorundasınız.
c. Disabled: Servisiniz devre dışı kalır.
Gerekli ayarlamaları yaptıktan sonra artık servisimizi install edebiliriz.

Şekil 14
Servisimizi Install etmek için, yukarıda şekil 14 ile göstrildiği biçimde, bir command penceresi açılır (Start > All Programs >
Microsoft Visual Strudio 2010 > Visual Studio Tools > Visual Studio Command Promt (2010)).
Açılan commad penceresine “installutil assamly path and name” formatında bir komut yazılarak install işlemi gerçekleştirilir. Şekil
15, 16 ve 17.

Şekil 15

Şekil 16
Yukarıdaki komut yazılıp “Enter” yapıldıktan sonra, şekil 16’da gösterildiği gibi bir login ekranı gelebilir. Bu durumda kullanıcı adı
ve şifrenizi girerek login olun. Bir domain içinde çalışıyorsanız, kullanıcı adınızın başına domain adını yazmayı unutmayın. Ayrıca,
servis install işlemini yapabilmeniz için, bu işlemin yapılacağı bilgisayarda admin yetkisine sahip olmanız gerekir.
Login işleminde sonra, işlemin başarılı bir şekilde tamamlandığını bildiren satırlar gelecektir. Şekil 17.

Şekil 17
Artık servisimiz install edildi. Bunu görmek için, Start(başlat) altındaki arama alanına services yazarak veya “Control Panel  >
Administrative Tools” tıklayarak açılan sayfadan, “Services” listesini açın ve “serviceInstaller1” özelliklerini belirlerken
“DisplayName” özelliğine verdiğiniz ismi listeden bulun. Biz örneğimizde “WinSvcDemo” adını vermiştik. Artık bu isimde bir
servisi Services listesinde görebiliyor olacağız.
Şekil 18
Servisimizi yukarıda şekil 18’de gösterildiği gibi, Services listesinde görebiliyoruz. “serviceInstaller1” özellikleri arasındaki
“StartType” özelliğini “Manuel” olarak seçmiş olduğumuz için, servisimiz stoped durumunda. Servisi başlatmak için, üzerine
mouse sağ butonu ile tıklayıp, açılan menüden “Start” komutunu vermemiz gerekiyor. Ayrıca, servisin “StartType” özelliği, sevis
özellikleri sayfasından değiştirilebilir. Şekil 19.

Şekil 19
YÜKLEMEYİ KALDIRMA (UNINSTALL)
Servisi kaldırmak için (uninstall) commad penceresine “installutil /u assamly path and name” formatında bir komut yazılır. Bknz.
Şekil 20 ve 21.

Şekil 20

Şekil 21
İşlem sonunda “The uninstall has completed” şeklinde bir mesaj alınmalıdır. Bu mesajı aldıktan sonra, servis listesinden kontrol
edildiğinde, az önce install ettiğimiz servisin artık listede olmadığını görürürüz.
DEBUG
Servis debug işlemi için önce, yukarıda anlatıldığı şekilde servis install işlemi yapılır ve servis çalıştırılır. Ardından servis projesi,
çalışmakta olan servise attach edilir. Attach etme işlemi, altta şekil 22 ve 23 ile gösterilmiştir.

Şekil 22
Şekil 22’de gösterildiği gibi “Attach to Process” tıklanarak altta, şekil 23 ilşe gösterilen “Attach to Process” ekranı açılır.
Bu ekranda, servisimizin gösterim ismi (DisplayName), “Available Processes” listesindeki “Process” kolonuna bakılarak bulunur ve
üzerine çift tıklanarak veya “Attach” butonu kullanılarak attach işlemi yapılır.
Bu noktadan sonra artık, ilgili yerlere break-point konularak debug işlemi yapılabilir.
Not: “Attach to Process” ekranındaki “Available Processes” listesinde servisi göremezseniz, listenin altında bulunan “Show
process in all sessions” seçeneğinin işaretli olup olmadığını kontrol edin. İşaretli değilse işaretleyin ve Refresh butonuna tıklayın.
Şekil 23
Servisi start etmeden attachment işlemi yapılamayacağından, servisin “OnStart” eventine break-point koyarak oradan debug
işlemine başlanması mümkün değildir. Onun yerine “Tmr1_Elapset” event’ine veya işlemleri yapan ilgili method’lara break-point
koyup debug başlatmak doğru olacaktır. Debug sırasındaki görüntü şekil 24 ile gösterilmiştir.

Şekil 24
SETUP PROJESİ HAZIRLAMA ve KURULUM
Servisimizi hazırladıktan sonra, başka bir bilgisayara, ya da sunucuya kurmak için, yapılması gereken öncelikli iş, bir setup
hazırlamaktır. Bunun için çeşitli araçlar kullanılabilir. Visual studio’nun da bize sunduğu bir imkan var ve şimdi o imkanla setup
dosyamızı nasıl hazırlayacağımızı göreceğiz.
Öncelikli işimiz, yeni bir setup projesi oluşturmak. Oluşturacağımız setup projesi ayrı bir solution altında olabileceği gibi, servis
projemizin bağlı olduğu solution içinde de olabilir. Aslında ikinci yöntem, yönetilebilirlik açısından daha kullanılışlıdır. Bu nedenle,
biz de setup projemizi, servisimizin altında bulunduğu mevcut solution altına oluşturacağız.
Altta şekil 25 ile de gösterildiği gibi; solution üzerine mouse ile sağ tıklıyoruz ve açılan menüden “Add > New Project” seçiyoruz.

Şekil 25
Açılan “Add New Project” ekranında; şekil 26 ile gösterildiği gibi, “Other Project Types > Setup and Deployment > Visual Studio
Installer” proje tipini seçiyoruz ve listelenen projeler arasından “Setup Project”i seçip, projeye bir isim veriyoruz. “OK” butonuna
tıklayarak projemizi oluşturuyoruz.
Bu ekranda “.NET Framework” sürümünü doğru şekilde seçmeyi unutmayın. Servis projemizi framework 4.0 ile
hazırladığımızdan, setup projesini de aynı .Net framework sürümü ile hazırlamakta fayda var.
Ayrıca setup projelerinize isim verirken, setup’ını oluşturduğunuz projenin adını yazıp, sonuna “_Setup” eklemek, takip ve yönetim
açısından size kolaylık sağlayacak, ayrıca bir standardınız olacaktır.

Şekil 26 Şekil 27

Setup projenizi oluşturduktan sonra solution klasörüne gittiğinizde, altta şekil 27 ile verilen ekran görüntüsü elde edilir.

Setup projemizi oluşturduktan sonra, oluşan projenin üzerine mouse ile sağ tıkladığımızda gelen menüden “Add > Project Output”u
seçin. Bknz.Şekil 28.
Şekil 28
“Add Project Output Group” isminde bir ekran açılacaktır. Bu ekran üzerinde; Project kısmında, servis projenizi seçin (bizim
projemiz WinSvcDemo). Hemen altındaki listeden “Primary output”u seçin ve “OK” butonuna basın.

Şekil 29
Tekrar projenin üzerine mouse ile sağ tıklayın ve gelen menüden “View > Custom Actions” seçin. Bknz.Şekil 30.

Şekil 30
“Custom Actions” seçildikten sonra, şekil 31’de görüldüğü gibi bir ekran açılacaktır. Bu ekrandaki “Custom Actions” üzerine
mouse ile sağ tıklayıp, “Add Custom Action”ı seçin.

Şekil 31
Açılan sayfadan, uygulamanın klasörünü seçin. “File System on Target Machine” seçili olarak gelir. Seçili gelmez ise, bu seçeneği
seçili hale getirin ve “OK” butonuna basın. Bknz.Şekil 32.
Şekil 32 Şekil 33

Aynı sayfadaki listede “Primary output from WinSvcDemo(Active)” görünmelidir. Görünmüyor ise, “Add Output” butonuna
tıklayarak, açılan “Add Project Output Group” ekranındaki listeden “Primery output” seçin. Bknz.Şekil 33.

“Primary output from WinSvcDemo(Active)” seçilip “OK” butonuna tıklandığında; “Custom Actions” altında bulunan, “Install,
Commit, Rollback, Uninstall” klaöslerinin herbisinin altında “Primary output from WinSvcDemo(Active)” görünecektir.
Bknz.Şekil 34.

Şekil 34
Bu işlemlerin arıdından, setup projesinin altındai “Detected Dependencies”e mouse ile sağ tıklayıp, “Refresh Dependencies”e
tıklayın. Bknz.Şekil 35.

Şekil 35
Bu işlem yapıldığında, servis projenize referans ettiğiniz tüm bileşenler “Detected Dependencies” altında görünecektir. Servisinize
yeni bir referans ekler veya referans çıkartırsanız, yukarıdaki işlemi tekrarlamanız gerekir.
Bu nokradan sonra, Setup projesini build ettiğinizde “Debug” klasörü altında “setup.exe” ve “WinSvcDemo.msi” isimli iki dosya
oluşacaktır. “setup.exe”, dosyası “msi” uzantılı diğer dosyayı çağırır. Bu nedenle, setup işlemi için hangi dosyanın çalıştırıldığının
bir önemi yoktur.
Herhangi bir ayarlama yapılmadığında, kurulum dosyaları öntanımlı (default) ayarlar ile oluşturulur. Ama istersek bazı ayarları
değiştirebiliriz.
Bunun için; “Solution Explorer” pencesinde setup projesini seçin ve proje seçiliyken “Properties” sekmesine geçin. Ya da
klavyeden “Ctrl +W,P” tuşlayın. Aynı sekmeyi, “View > Properties Window” menüsüyle de açabilirsiniz.
Properties sekmesinde pek çok ayar olduğunu göreceksiniz. Örneğin;
 “Author” özelliğine firmanızın ismini ya da kendi isminizi yazabilirsiniz. Biz şimdilik buraya “ServisDemo” Yazalım. 
 “Localization” özelliği ile dili Türkçe yapabilirsiniz.
 “Manufacturer” özelliğine “ServisDemo Firmasi” yazalım.
1. “Remove Previous Version” özelliğine “true” değeri verilirse, her yeni sürüm kurulduğunda, eski sürüm otomatik olarak
kaldırılır.
 “Version” özelliğinin, her değişiklikte değiştirilmesinde fayda vardır. Bu şekilde sürümleri ve sürümler arası farkları
kolayca takip edebilirsiniz.
1. “InstallAllUsers” özelliğine “true” değeri verilirse, kurulum o bilgisayarı ya da sunucuyu kullanan her bir kullanıcı için
kurar ve kurulum wizard’ında bununla ilgili seçenek otomatik seçili gelir. Ama istenirse kurulum sırasında değiştirilebilir.
Gerekli ayarlamalar yapıldıktan sonra tekrar build alırsanız, yeni setup dosyaları oluşturulacaktır. Bundan sonra, “msi” uzantılı
dosyayı, kurulumun yapılacağı bilgisayara ya da sunucuya taşıyıp çalıştırmanız yeterli. Kurulumdan sonra, “Services” listesine
servisinizin eklendiğini kontrol edin ve eğer “StartType” manuel veya Diasbled olarak seçilmiş ise, servisinizi elle başlatın. Artık,
kendi kendine çalışan bir windows servisiniz oldu.

You might also like