Assembly etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Assembly etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

2 Nisan 2011 Cumartesi

C#'da Shared Assembly Oluşturmak

Assembly kısaca; kaynak kodun, derleyiciden cikmasiyla olusan dosyadir. Uzantisi iki farkli sekilde olur. dll yada exe'dir. dll, bilindiği gibi, projemize referans eder, içindeki hazır fonksiyonları, classları vs. kullanırız. exe ise, oluşturduğumuz uygulamanın çalışmasını sağlayan dosyaydı. Bu iki bilgi çok temel bilgidir fakat eksik şeyler var aslında burada. Öncelikle, .Net 2.0 ile birlikte 2005 yilindan sonra artik exe'ler de projeye referans edilmeye basladi. Peki bu dll,exe dosyaları nerede bulunur. Projemizin oluşturulduğu klasörü açtığımız zaman, bin klasörü içinde bulunan debug klasörünün içinde yer almaktadırlar dll ve exe. Aslında pdb uzantılı dosyalar da mevcuttur ama pek bilinmez ve kullanılmazlar. Yine de söylemek gerekirsek,  kısaca bu dosyalar da, debug yaparken bazı loglamaların saklandığı dosyalardır.

Bu bilgiler eşliğinde, şundan da kısaca bahsetmek gerekir. Bazı dll'ler, Visual Studio'yu ilk açtığımız andan itibaren kendiliğinden referans edilmiştir. Hatta biz onları references'dan silsek bile hata verilmez. Bunların dışında, kendi elle verdiğimiz dll'lerde mevcuttur. Tüm bu dll'ler .Net Framework içinde olabileceği gibi, daha sonradan oluşturulup, kullanılmak istenen dll'ler de olabilir.

İşte .Net dilinde, hazır framework içinde bulunan dll'lere Shared Assembly, Kendi yazdığımız,  sonradan oluşturulmuş dll'lere de Private Assembly denir. Private Assembly'ler kullanıldığı yerin yanında olmak zorundalar. Shared Assembly'ler için böyle bir zorunluluk yoktur. Yukarıda dediğim gibi, references'dan silsek bile o dll'i hata çıkarmaz. Bu dll'lere örnek verecek olursak, en başta System.Data dll'i gelir.

Shared Assembly'lerin bulunduğu/saklandığı yere GAC denir. Açılımı Global Assembly Cache'dir.

Şimdi biz de kendi yazdığımız dll'i(Private Assembly) Shared Assembly haline getirelim. Bunun için yapmamız gereken  ilk özellik, bu dll'e strong name (yani ona özgünlük sağlayacak) bir isim vermek olmalıdır. Bu isme de , projemize sağ tıklayıp properties dedikten sonra signing kısmından erişiyoruz.


Gördüğünüz gibi, mykey.snk isminde strong name oluşturdum.

Daha sonra da Visual Studio'nun Command Prompt ekranını açıp (Başlat-All Programs-Microsoft Visual Studio2010-Visual Studio Tools-Command Prompt) şu komutları yazmalıyız.



4 Mayıs 2010 Salı

C#'da Assembly Kavrami ve Runtime Sureci

Bugun C#'a giris yapmadan once, tum bu yapilanlarin arkasinda nasil bir senaryo var, biz f5'e bastigimizda, makine arkada bizim icin neler yapiyor bunlari inceleyecegiz. Onemli mi, bence onemli, cunku yaptigimiz isin mantigini oturtmus oluruz, hata ayiklamada vs. yardimci olur bu bilgiler. Ayrica ufak bir not, bu bilgiler cogu is gorusmelerinde sorulan ve cok az kisinin bilebildigi bilgiler oldugunu da ekleyeyim.

Simdi gelelim konumuza;

Kisaca f5 yaptigimizda islerin nasil calistigini anlatayim. Biz kodlarimizi yazdik, compile etmemiz gerekiyor. Bunu csc.exe yardimiyla yapiyoruz. Makine bunu "IL Code" denilen kodlara ceviriyor. Bunlar makinenin anlamadigi kodlar. Tabi bunlari da makineye tanitmak gerekiyor. Iste burada CLR dedigimiz dil - o da basli basina ayri bir dil aslinda- devreye giriyor ve makineye hello world yazdir diyor. Kisaca calisma mantigi bu. Tabi bu mantik javada'da ayni sekilde isliyor fakat orada, CLR'in yerini "Java Virtual Machine" aliyor.

Sunu da belirtmemiz lazim, cunku programimizi yazip compile ettigimiz zaman surekli su hatalari goruruz, "Runtime error" veya "Compiletime Error". Iste bunlarin nerede sorun cikardigini anlamak icin sunu bilmemiz gerekir ki; bizim kodu yazip, calistirip IL Code'larinin olusturma surecine biz Compile Time derken, IL Code'larin CLR yardimiyla makinenin anlayacagi dile donusturmesi zamanina da Run Time adini veriyoruz.

Simdi sikca duydugumuz bir kavrami daha aciklayalim. Assembly kavrami nedir? Assembly aslinda bir dosyadir, dosya ismidir. Assembly hakkinda bilmemiz gereken sey, icinde nelerin bulundugu ve bunlarin ne gorevi oldugu. Kisaca aciklamak gerekirse, Assembly 4 kisimdan olusuyor;

1-Manifest: Bu kisim assembly yapisinin en ustunde bulunur ve bize assembly'nin kimlik bilgisini verir. Yani kod yazarken sirket kodu, veya urun kodu, versiyon no gibi kimlik bilgileri bu kisimda tutulur. Assembly'nin kimlik karti diyebiliriz Manifest icin. Ayrica sunu da belirtelim, bu kisimda kullanilan dll listesi de bulunur.
2-IL Code: Yukarida da anlatmistik ama kisaca tekrar uzerinden gecelim. Compile time sirasinda olusan kodlardir. Makine bu kodlari anlamaz ve bu kodlari makinenin anlayacagi dile donusturmek gerekir. Iste bu gorevi yapan kisim da C# dilinde CLR iken, Java dilinde Java Virtual Machine'dir.
3-Metadata: Bu kisim da onemli aslinda. Yazdigimiz kodda, hangi tiplerin, bu tiplere ait hangi uyelerin vs. kullanildigini gosteren, bu bilgileri tutan kisimdir. Kisaca su ornegi verirsek, gozunuzde daha iyi canlanir. Ornegin bir class olusturduk, o class'in ismini yazip noktaya bastigimiz zaman intellisense bize yardimci olur, tanimlanan metotlar,degiskenler .vs onumuze getirir. Iste intelisense de bize bunu metadata kismina gidip oradan getiriyor aslinda. Onemli bir kisimdir.
4-Resources: Bu kisim da aslinda onemli bir kisim ama ihtiyac duyuldugunda onemlidir. Yani kullanicinin opsiyonuna baglidir bu kisim. Ornek uzerinden aciklarsak cok iyi anlasilacaktir. Biz kod yazdik ve kodlarin icine resim dosedik. Iste biz bu resimleri eger kendi bilgisayarimizin resimler klasorunden yuklediysek, baska bilgisayar gittigimizde bu resimler olmayacagindan program duzgun calismayacaktir, ama biz resources kismi yardimiyla tum bu resimleri yazdigimiz programa yukluyoruz ve boylece tum bilgisayarlarda sorunsuz calismasi saglaniyor.

Kisaca bilmemiz gerekenler bunlardi aslinda. Ozellikle arka planda neler donuyor kismini merak eden arkadaslar buradan yararlanabilirler. Dedigim gibi is gorusmelerinin de vazgecilmez sorularindandir bunlar :)