İlginizi Çekebilir
  1. Ana Sayfa
  2. C Sharp

C# Windows Servis Hazırlama ve Yükleme

C# Windows Servis Hazırlama ve Yükleme
+ - 4

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.

Windows Servis Nedir

Makinenizde çalışan tüm hizmetleri aşağıdaki şekillerde de bulabilirsiniz:
  • 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.

Windows Service new project

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.

C# Windows Servis Hazırlama ve Yükleme

Boş bir alanda sağ tık yapıyoruz ve “Add Installer” diyoruz.

C# Windows Servis Hazırlama ve Yükleme 1

Installer’ı ekledikten sonra ProjectInstaller projemize eklenecek ve ProjectInstaller.cs dosyası açılacaktır.

Windows Service in CSharp

Her şeyi kaydetmeyi unutmayın (ctrl + shift + s tuşlarına ile)

Windows Service in CSharp

Bu ekrana geldikten sonra boş alanda sağ tık yapıp “View Code” diyoruz.

Şimdi kod kısmına geçelim.

C# Windows Servis Hazırlama

ProjectInstaller.cs InitializeComponent yöntemini içeren Constructor’a sahiptir:
InitializeComponent yöntemi, şekillendirme yüzeyinde sürüklenen ve Form Tasarımcısının Özellik Kılavuzunu sağlayan kullanıcı arabirimi nesnelerini oluşturan ve başlatan mantığı içerir.
Çok Önemli: InitializeComponent yönteminin çağrılmasından önce hiçbir yöntemi çağırmayı denemeyin.
Şimdi InitializeComponent yöntemini seçin ve tanıma gitmek için F12 tuşuna basın
Şimdi aşağıdaki satırı ekleyin:
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";

C# Windows Servis Hazırlama 2

Ş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.InstallLog

Tamamlama 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… :)

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)

Yorumlar (4)

  1. 3 sene önce

    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.

  2. 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?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.