11 Ocak 2009 Pazar

Assembly Kavramı

.NET Teknolojilerinde uygulamanın ilgili dilin derleyicisiyle derlenmesi sonucunda oluşan .exe veya .dll uzantili dosya bir assembly içinde yer alır.Bu assembly'nin programlama dili olan assembly ile karıştırılmaması gerekmektedir.Burda bahsi geçen assembly derlenmiş olan .exe veya .dll uzantılı binary dosya ile aynı kavramı ifade etmektedir.Assembly dört bileşenden oluşur.Bunlar CIL, Metadata, Manifesto,Source'dır.CIL(Common Intermediate Language) kaynak kodun derlenmesi sonucunda oluşan ortak ara dildir.Metadata ise assembly üyelerinin listesini barındıran bir çeşit etikettir.Assembly adı,versiyonu,kültür bilgisi gibi bilgileri barındırır.Manifesto bir nevi assembly metadatası olup assembly'nin kendisini tanımlayan bilgilerini içerir.Kaynaklar ise resim,müzik gibi multimedya dosyalarını içeren yapıdır.Basit olarak bir assembly'nin yapısı bu şekildedir.

Private ve Shared Assembly

Genellikle yazdığımız uygulamalara çeşitli nedenlerden ötürü. dll referans ederiz. Uygulamamız bu. dll dosyası içerisindeki kaynak kodları referans alarak çalışmaktadır. Bu nedenle uygulamamıza referans ettiğimiz. dll dosyası silinir veya uygulamanın bulunduğu dizinden  farklı bir dizine taşınırsa uygulamamız hata verecek ve çalışmayacaktır. İşte bu tip. dll dosyalarının oluşturduğu assembly’e Private Assembly denir. Kısaca referans edildiği uygulama ile aynı dizin altında veya bir alt dizinde bulunması zorunlu olan assemblylerdir. Oluşturulan her assembly varsayılan olarak privatedir.
Bazı durumlarda aynı dll dosyasını birden fazla uygulamada kullanmak isteriz. Bunun için dll dosyasını kullanılacağımız uygulamaların bulunduğu dizinlere tek tek kopyalamak gerekecektir. Ve bu durumda aynı Private assemblydeki olduğu gibi sıkıntılar olacak, dll dosyasının silinmesi veya taşınası halinde uygulamamız çalışmayacaktır. Bunun yerine Windows dizini assembly klasörü altında dll dosyalarımızı güvenle tutabileceğimiz bir yapı mevcuttur. Bu yapının adı Global Assembly Cache (GAC) ’dır. Oluşturulan dosyaları GAC’a atmak suretiyle bütün uygulamalarımıza çok rahat bir şekilde referans edebiliriz.Bu şekilde Shared assembly elde etmiş olmaktayız.GAC ‘a direkt olarak kopyalama işlemi yapılamaz.Oluşturulan dll dosyası bir takım işlemlerden geçtikten sonra GAC’a gönderilir.Şimdi bu kurallara göz atalım.Öncelikle dll dosyası bir strong name ‘e sahip olmalıdır.Strong name, public key,assembly versiyon bilgisi,kültür numarasının bir araya gelmesiyle oluşur.Public key değeri, mscorlib adı verdiğimiz .Net platformunun exe'lerini çalıştırmakla yükümlü olan dll tarafından üretilen 128 bytelik bir değerdir.Bu değer Hash algoritması ile 20 bytelik bir değere çevirilir ve bu 20 bytelik değerin son 8 byte alınıp ters çevirilerek public key bilgisi oluşturulur.Bu da benzersiz bir assembly ortaya çıkarır.Daha sonra Visual Studio Command Prompt yardımıyla sn.exe aracı kullanılarak key değeri oluşturulur.

sn –k MyKey.snk

Datalar binary olarak tutulduğundan dolayı uzantının bir önemi yoktur.İstediğimiz değeri verebiliriz. Ancak Windows tarafından tanınan uzantı .snk’ dır ve kullanılması tavsiye edilir.Bir sonraki aşamada oluşturulan .snk uzantılı dosya ile GAC’a atılacak olan dll dosyası derlenir.

csc /t:library /KeyFile:MyKey.snk Derlenecekolan.dll

Bu işlemde sonra artık assembly’i GAC’a atabiliriz.Bu işlem için gacutil.exe aracı kullanılmalıdır.

gacutil –i Derlenecekolan.dll

Artik assembly GAC’a atılmıştır.Bu adımdan sonra yapılması gereken bu dll referans edecek olan uygulama kendi klasörü altında bulunan dll ile tekrar derlenmelidir.Derleme işlemi sonucunda artık aynı klasör altında bulunan dll silinse dahi uygulama sorunsuz olarak çalışacaktır.Çünkü dllimizi kullanan uygulama artık GAC’da duran dll'i referans olarak kullanmaktadır.Bu dll sadece kullanıldığı zaman belleğe çıkmaktadır.

Hiç yorum yok: