Bu ay teknik bir yazı ile karşınızdayım. Yazılım teknolojisi ve
teknikleri sürekli gelişiyor, bu gelişimi yakalamak
için bizim de gelişmemiz
gerekli. Bu ayki yazım eklenti yani plug-in tabanlı programlama üzerine. Peki
nedir eklenti tabanlı programlama?
Birçoğumuz Eclipse ya da Photoshop gibi programlar kullanmışızdır. Bu
programları kullanırken bir menüsünden veya internetten eklentiler indirebilir
ve kurabiliriz. Programın sonlanmasına gerek kalmadan eklediğimiz yeni eklenti
yani özellik kurulabilir ve program üzerinde anında kullanılmaya başlayabilir.
Benim için eklentilerin program sırasında eklenebilmesi ve herhangi bir derleme
olmaksızın çalışması çok ilgi çekiciydi. Bir eklentinin çalışabilmesi için temel
bir sınıftan türemiş bir sınıf olmasının gerekli olduğunu düşünüyordum ama
nasıl derleme olmadan çalışma zamanında programa eklenir hiçbir fikrim yoktu.
Bunun için çok fazla çözüm olduğuna emindim, özellikle işletim sistemleri ve
işletim sistemleri arasından özellikle Linux çekirdeği bunu mükemmel bir
şekilde gerçekleştiriyor. Ben de Microsoft yaz okulunda sayın hocam Sefer
Algan’ dan aldığım eğitim ve biraz araştırma ile çok yaygın kullanılan
Microsoft .NET teknolojisi ile eklenti
tabanlı uygulama geliştirmeyi öğrendim. Bu öğrendiklerimi küçük bir uygulama
ile size aktarmaya çalışacağım.
Eklentileri DLL yani dinamik kütüphaneler yardımı ile programımıza
ekleyeceğiz. Dinamik kütüphanelerin exe dosyalarına benzer yapıları vardır.
Derlenmiş kodlar olarak tanımlanabilirler ama çalışmaları için başka exe dosyasına ihtiyaçları vardır. Bir
program bir dll dosyası içerisindeki sınıfları ve fonksiyonları kullanabilir.
C# dilinde “reflection” kütüphanesi sayesinde çalışma sırasında ismini
parametre olarak verdiğimiz bir dll dosyasını
kullanabiliyoruz. Yine parametre
olarak verdiğimiz sınıfların tür bilgisini bu dll dosyasından çekerek o
sınıfların nesnelerini oluşturabiliyoruz. Zaten eklenti nesnesini oluşturduktan
sonra temel sınıfın fonksiyonlarını kullanarak eklentiyi kullanabiliriz.
Örnek uygulama olarak bir mesajlaşma programı düşünelim. Bu program
MSN, ICQ ve benzeri mesajlaşma sistemlerine bağlanıp tek bir arayüz üzerinden
mesajlaşma sağlasın. Yeni bir mesajlaşma sistemi eklememiz gerektiğinde (örnek
olarak GTalk, Facebook) uygun bir dll hazırlayıp proje klasörüne ekledikten
sonra “cofig.txt” dosyasına bu yeni dll’ i de ekleyerek programı yeni sisteme
hazır hale getirebilelim.
İlk yapmamız gereken bir temel sınıf oluşturmak. Bu temel sınıfta bize
gereken en temel fonksiyonlar ve değişkenler olmalı. Sisteme giriş, mesaj
gönderme, mesaj alma ve sistemden çıkış gibi 4 temel fonksiyona sahip olsun
sistemimiz. Siz gerçekten böyle bir uygulama geliştirmek isterseniz daha
gelişmiş bir temel sınıf oluşturmalısınız. Bu sınıfı geliştiricilere bir dll
içinde yer verebiliriz. O yüzden Visual Studio içerisinde bir “class library”
projesi oluşturuyoruz.
Sınıfımızı resimdeki gibi oluşturduk. Sınıfın ve fonksiyonların
abstract olmasının sebebi yeni eklenen eklentilerin yani mesajlaşma
sistemlerinin bu fonksiyonları kullanmak zorunda olmasıdır. Bu projeyi built
ettikten sonra oluşan dll dosyasını saklıyoruz.
Şimdi yeni ekleyeceğimiz eklentileri yönetecek bir yapıya ihtiyacımız
var. Bu yapı bir text dosyasından, eklentilerin dll dosyasının ismini ve yeni
eklentinin class’ ının namespace ve isim bilgilerini alacak. Bu isimleri
kullanarak eklentiyi dinamik olarak oluşturacağız. Şimdi yeni bir proje açarak
text dosyasındaki verileri okurken kullanacağımız plugin class’ ı
oluşturuyoruz.
Projemize Messenger temel class’ ının dll dosyasını referans olarak
verdikten sonra aşağıdaki class’ ı oluşturuyoruz. Bu sınıf, dosyadan bilgileri
okuyup eklenti nesnelerini oluşturacak. İçerisindeki plugins nesnesi dosyadaki
verileri, plugingsObject ise plugin nesnelerini tutacak. dllName bizim
ekleyeceğimiz eklentileri barındıran dll dosyalarının adı, className ise bu dll
içerisindeki classların adıdır.
readFile fonksiyonumuz ile Messenger.txt dosyasındaki veriler plugins
nesnesi üzerine yüklenir. Messenger.txt dosyasını projemize eklemeyi
unutmuyoruz. Plugins nesnesi bir template sınıf olan list’ dir. Yani hazır bir
bağlı liste yapısıdır.
Handle fonksiyonu reflection kütüphanesini kullanarak dinamik olarak
dll’ ler üzerindeki pluginlere ait nesneleri oluşturuyor. Oluşturduğu nesneleri
plugingObject nesnesi (template bir sınıf olan Dictionary den türemiş olan)
üzerine yüklüyor.
Bir main fonksyon oluşturarak oluşturulan her plugin için login
yapacağız. Login fonksiyonları içerisinde mesajlar vererek işlemimizi kontrol
edeceğiz. Foreach döngüsü içerisinde yüklenmiş tüm pluginler için login
fonksiyonunu çağırıyoruz.
Bundan sonraki adımımız MSN eklentisini oluşturmak. MSN eklentisini bir
dll içinde tutacağız, bu yüzden yine bir “class library” projesi açıyoruz ve
Messenger sınıfından türemiş sınıfımızı oluşturuyoruz.
Bu projeyi de built edip oluşan dll’ i saklıyoruz. Kodların içerisini
doldurmadım ama siz MSN Messenger’a ait bir API’ yi kullanarak ya da Live
hizmetlerinden yararlanarak bunu gerçekleştirebilirsiniz. Test etmek için de
fonksiyonların return değerlerini yazmalısınız. Bundan sonra yapmamız gereken
asıl programı yazmak. Bu program text dosyasından MSN eklentisine ait dll
ismini ve sınıf ismini alacak. Bu isimleri kullanarak programın çalışma
süresinde, hakkında hiçbir veriye sahip olmadığı MsnMessenger sınıfından
türemiş bir nesne oluşturacak.
Bu yeni eklentimizin dll dosyasını asıl projemizin exe dosyasının
yanına koyduktan sonra Messenger.txt dosyasını şu şekilde düzenliyoruz:
Asıl projemizi çalıştırdığımızda ekran çıktımız aşağıdaki gibi olacak.
Artık
eklenti tabanlı çalışan bir programımız var. Eklenti tabanlı programlama bize
sürekli genişleyen projelerde yönetim ve güncelleme kolaylığı sağlar. Umarım
sizin için faydalı bir yazı olmuştur. İyi okumalar ve yazmalar.