Dinamik Kütüphanelerin Kullanılması (dll)

Uzantısı .dll şeklinde bulunan dosyalara dinamik kütüphane dosyaları denir. Aslında .exe formatı ile .dll dosya formatı arasında küçük bir ayrıntıdan başka fark yoktur. Her ikiside PE (Portable Executable) formatına sahiptir. Bu dosyalar arasındaki tek fark .exe dosyanın main metoduna (entry point) sahip olması, diğerinin olmamasıdır. (Şüphesiz dll dosyaları içerisinde de main isimli metodlar bulunabilir fakat artık o main metodları bir başlangıç metodu ifade etmezler.) Bu nedenle .exe dosya çalışır dakat .dll dosyası çalışmaz.

Bunun dışında içerikleri tamamen aynıdır. Zaten teknik olarak bir .exe dosyası bir .dll dosyası gibi kullanılabildiği halde, bir .dll dosyası .exe dosya gibi kullanılamamaktadır.
.dll içerisindeki sınıflar ve kodlar derlenmiş bir biçimde bulunmaktadır.
Bir kaynak dosya csc.exe derleyicisiyle derlenirken, .exe ‘mi yoksa .dll ‘mi yapılacağı belirlenir.
csc.exe derleyicinde /target seçeneği, üretilecek dosyanın biçimini belirlemekte kullanılır. /target seçeneği şu biçimde kullanılır: /target : [exe, winexe, library, module]
/target ile /t tamamen aynı anlamdadır. /target seçeneğindeki argümanlar şunlardarn biri olabilir.
exe : Bu seçenek konsol exe dosyası üretir ve default’tur. Yani /target seçeneği hiç belirtilmezse sanki /target : exe belirtilmiş gibi işlem görür. Konsol exe programlar işletim sistemi tarafından siyah konsol penceresi çıkartılarak çalıştırılır. (Tabi biz komut satırında yani zaten konsol penceresi içerisindeysek ayrıca bir konsol penceresi açılmaz.)
winexe : Bu seçenek daha çok gui programlar için kullanılır. Burada program çalıştırıldığında bir konsol penceresi açılmaz. Normal gui pencereleri program koduyla oluşturulmaktadır. Eğer derleme winexe seçeneği ile yapılırsa konsol penceresi açılmaz, programcı kod içerisinde de pencere yaratmadıysa program penceresiz çalışır. Bir program hem konsol penceresine hem de gui penceresine sahip olabilir.
library : Bu seçenek dll yapmak için kullanılır.

module : Bu seçenek üzerinde durulmayacaktır.

IDE kullanarak dll oluşturmak oldukça kolaydır. Project/Properties penceresi açılır; Output type, “class library” olarak seçilir. Artık program derlendiğinde .exe yerine .dll oluşur.

Kütüphane Dosyalarının Kullanılması

.exe ve .dll dosyalarına .Net dünyasında “assembly” denilmektedir. (Buradaki assembly teriminin sembolik makina dili assembly language ile bir ilgisi yoktur.) Bir dll içerisindeki öğeleri kullanırken derleyici bu durumdan haberdar etmemiz gerekir. Bu işleme ilgili dll’e referans etmek denir. Bir dll’e referans edildiğinde derleyici, dll içerisindeki tüm bilgileri sanki biz yazmışız gibi işleme sokar. Referans etme işlemi /reference (/r) şeklinde yapılır. /r :
Elimizde a.cs ve b.cs şeklinde iki kaynak dosya bulunsun. b.cs dosyasını dll olarak derleyip a.cs dosyasından kullanacak olalım. Komut satırından şunları yapmamız gerekir:
csc /target : library b.cs
csc /target : exe /r : b.dll a.cs
Burada a.exe dosyası b.dll dosyasını kullanmaktadır.
Bir .exe birtakım .dll dosyalarını kullanıyorsa bu .exe dosyaları çalıştırılırken onun kullandığı .dll dosyalarının da bulundurulması gerekir. Yani örneğimizde hedef makinaya yalnızca a.exe dosyasını değil b.dll dosyasını da taşımak gerekir. Ayrıca program çalışırken bu .exe ve .dll dosyalarının aynı dizin içerisinde bulunması gerekir. Fakat dll’e referans edilirken o dll’nin aynı dizinde bulunması gerekmemektedir.
Birden fazla dll benzer biçimde referans edilebilir. Örneğin:
csc /r : x.dll /r : y.dll sample.cs
Sınıf bildiriminin başına erişim belirleyicisi olarak public ya da internal anahtar sözcüklerinden biri getirilebilir. Erişim belirleyicisinin yazılmaması internal yazılması ile aynı anlamdadır. İşte bir dll’deki sınıfın başka bir assembly’den kullanılması için public olması gerekir. internal sınıflar referans edilse bile başka bir assembly’den kullanılamazlar.
IDE’den bir dll’ye referans etmek için solution explorer’da “references” kısmına gelinip bağlam (contex) menüsünden “add reference” seçilip, “browse” sekmesine gelinip dll seçilir. Referans edildikten sonra IDE aynı zamanda dll’yi exe’nin bulunduğu dizine kopyalamaktadır.
Bir dll’de başka dll’leri kullanabilir. Yani örneğin biz bir y.dll oluşturmak isteyelim. x.dll içerisindeki sınıfları kullanabiliriz. Bu durumda y.dll derlemesini şöyle yaparız:
csc /target : library /r : x.dll y.cs
Burada y.dll, x.dll’ye bağımlı olmaktadır. Şimdi biz bir uygulama içerisinden y.dll kütüphanesini kullanmak isteyelim. Bu durumda bizim ayrıca x.dll’ye referans etmemize gerek yoktur.
csc /r : y.dll sample.cs
Fakat tabii buradan elde edilen sample.exe dosyasının çalıştırılabilmesi için hem x.dll hem de y.dll’nin hazır bulundurulması gerekir.

Not: Visual Studio IDE’sinde .Net’in kendi dll’lerine kolay referans edebilmek için Add Reference penceresinde .Net sekmesi kullanılır.

Dll’ler ve İsim Alanları

Bir dll içerisinde çok farklı isim alanlarına ilişkin sınıflar bulunabilir. Yani isim alanlarıyla dll’leri bire bir eşlemek mümkün değildir. İsim alanları mantıksal, dll’ler fiziksel bir kap oluşturmaktadır. O halde bir sınıfı kullanabilmek için önce onun hangi dll’de olduğunu, sonra hangi isim alanı içerisinde olduğunu bilmemiz gerekir.

GAC (Global Assembly Cache)

10 farklı uygulama aynı dll’I kullanıyor olsun. Kurulum sırasında bu 10 uygulama program files dizininin altında farklı dizinlere kopyalanacaktır. Peki dll’ler .exe dosya ile aynı dizinde bulunacağına göre bu ortak dll, bu 10 uygulamanın her birine yeniden kopyalanacakmı? İşte .Net’te iki seçenek söz konusudur. “private assembly” denilen seçenekte ilgili dll o uygulamaya özgü kabul edilir ve o dll’in .exe dosyası ile aynı dizinde bulunması gerekir. İkinci bir seçenek “shared assembly” dir.
İşte bir dll GAC denilen özel bir dizine yerleştirilirse csc.exe ve clr(çalışma aşaması) bu dll referans edildiğinde otomaktik bulacaktır. Böylece 10 uygulamanın kullandığı ortak dll’I GAC’a yerleştirilirse her uygulamanın dizinine çekilmek zorunda kalınmaz. .Net’in kendi dll’leride GAC’a yerleştirilmiştir.
Bir dll’i GAC’a yerleştirmek için ona versiyon bilgisi atamak ve güvenlik anahtarı atamak gerekir. Yerleştirme işlemi gacutil denilen bir programla yapılmaktadır.

Leave a Reply

Site Footer