C Sharp Programlama Dili/Assembly kavramı

Ders 28. Assembly kavramı


Derlenmiş exe ve dll dosyalarına assembly denir. Çalışan programımız içinde bir assembly olabileceği gibi birden fazla assembly de olabilir. Programımızda birden fazla assembly olması demek programımızın ilişkide olduğu bir ya da daha fazla dll dosyası mevcut demektir. System isim alanındaki AppDomain sınıfı çoklu assembly işlemleriyle ilgilenirken, System.Reflection isim alanındaki Assembly sınıfı ise tek bir assembly ile ilgili işlemler yapılmasını sağlar. Şimdi bu iki sınıfın çeşitli özelliklerini inceleyelim:

  • AppDomain sınıfının static CurrentDomain özelliği o an üzerinde çalışılan assembly grubunu bir AppDomain nesnesi olarak döndürür.
  • AppDomain sınıfının static olmayan GetAssemblies() metodu, ilgili AppDomain nesnesindeki bütün assemblyleri bir Assembly dizisi olarak tutar.
  • Assembly sınıfının static olmayan Location özelliği ilgili assemblynin sabit diskteki yolunu string olarak verir. Şimdi bu teorik bilgileri bir örnek üzerinde görelim:
 using System;
 using System.Reflection;
 class Assemblyler
 {
    static void Main()
    {
       AppDomain ad=AppDomain.CurrentDomain;
       Assembly[] assembly=ad.GetAssemblies();
       Console.WriteLine("Toplam assembly sayısı: "+assembly.Length);
       for(int i=0;i<assembly.Length;i++)
          Console.WriteLine("Assembly yeri: "+assembly[i].Location);
    }
 }

Benim bilgisayarımda bu programın ekran çıktısı şöyle oldu:

Toplam assembly sayısı: 2
Assembly yeri: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
Assembly yeri: C:\Documents and Settings\Bekir Oflaz\new2.exe

mscorlib.dll dosyası şimdiye kadar sıklıkla kullandığımız System isim alanı ve bu isim alanına bağlı alt isim alanlarının içinde bulunduğu dosyadır. C# derlediğimiz her dosyaya bu dosyayı otomatik olarak ilişkilendirir. Bu dosyanın yolu kullandığınız .Net Framework sürümüne bağlı olarak sizde değişebilir.

Bazen programımızın ilişkiye girdiği dll dosyasının da ilişkiye girdiği başka bir dll dosyası olabilir. Bu durumda AppDomain sınıfının CurrentDomain özelliğiyle oluşturulan AppDomain nesnesine söz konusu bütün dll dosyaları dâhildir. Ancak tabii ki farklı assemblyler aynı dll dosyasını kullanıyorsa yalnızca bir tane dll AppDomain nesnesine dâhil edilir. Ayrıca AppDomain sınıfının GetAssemblies() metodu ile oluşturulan Assembly dizisinde sıra esas programda karşılaşılma sırasına göredir. Eğer programda System isim alanı kullanılmışsa ilk öğe mscorlib.dll'dir. Ondan sonra gelen öğe esas programımız, bundan sonra gelen öğeler ise karşılaşılma sırasına göre dll dosyalarıdır. Eğer herhangi bir dll dosyasını programımıza ilişkilendirir ancak söz konusu dll'i programımızda kullanmazsak söz konusu assembly programımıza dâhil değilmiş gibi hesaba katılır.

  • Assembly sınıfının static GetExecutingAssembly() metodu ile o an çalışan assemblynin kendisi bir Assembly nesnesi olarak döndürülür.
  • Assembly sınıfının static olmayan EntryPoint özelliği ilgili assemblynin başlangıç metodunu MethodInfo sınıfı türünden bir nesne olarak döndürür. MethodInfo sınıfını ileride göreceğiz. Başlangıç metodu çalıştırılabilir exe dosyalarında genellikle Main() metodudur. Dll dosyalarında ise başlangıç metodu yoktur. Bu yüzden bu özellik dll dosyaları için null değeri döndürür. Şimdi bu iki bilgiyi örnekleyelim:
 using System;
 using System.Reflection;
 class Assemblyler
 {
    static void Main()
    {
       Assembly nesne=Assembly.GetExecutingAssembly();
       Console.WriteLine("Assemblynin başlangıç metodu: "+nesne.EntryPoint);
    }
 }
  • Yeri gelmişken söylemek istiyorum. Bir sınıfın ya da yapının bir nesnesini Console.Write() ya da Console.WriteLine() metodu ile ekrana yazdırırsak aslında o nesnenin ToString() metodunun geri dönüş değerini ekrana yazdırmış oluruz. ToString() metodu normalde object sınıfına bağlıdır ve ilgili nesnenin türünü string olarak döndürür. Ancak tabii ki istersek kendi sınıf ya da yapılarımızda bu metodu override edip ilgili nesnemizin Console.Write() ya da Console.WriteLine() ile ekrana yazdırılırken nasıl davranması gerektiğini ayarlayabiliriz. Örnek:
 using System;
 class Sinif
 {
    override public string ToString()
    {
       return "Deneme";
    }
 }
 class Ana
 {
    static void Main()
    {
       Sinif a=new Sinif();
       Console.WriteLine(a);
    }
 }

Bu program sonucunda ekrana Deneme yazılacaktır. İstersek Sinif sınıfına yeni üye elemanlar ekleyip ekrana yazdırılacak şeyin nesneye bağlı olmasını sağlayabiliriz. Bu örneğimizde ekrana yazılacak şey nesneye bağlı değildir. Bu ipucundan sonra asıl konumuza dönebililiriz.

  • Assembly sınıfının static LoadFrom(string assembly_yolu) metodu bir assembly nesnesi döndürür. Örnek:
 using System;
 using System.Reflection;
 class deneme
 {
    static void Main()
    {
       string yol=@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll";
       Assembly nesne=Assembly.LoadFrom(yol);
       Console.WriteLine("Assemblynin başlangıç metodu: "+nesne.EntryPoint);
    }
 }

Bu program sonucunda assemblynin başlangıç noktası olarak ekrana hiçbir şey yazılmayacaktır. Çünkü null demek yokluk demektir.

  • Assembly sınıfının static olmayan GetTypes() metodu ilgili assemblydeki tüm türleri (sınıf, yapı, vb.) bir System.Type dizisi olarak döndürür. System.Type sınıfını ileride göreceğiz. Ancak şimdilik buna basit bir örnek verelim:
 using System;
 using System.Reflection;
 class deneme
 {
    static void Main()
    {
       AppDomain ad=AppDomain.CurrentDomain;
       Assembly[] assembly=ad.GetAssemblies();
       for(int i=0;i<assembly.Length;i++)
       {
          Console.WriteLine("Assembly: "+assembly[i].Location);
          Console.WriteLine("Tür sayısı: "+assembly[i].GetTypes().Length);
          Console.WriteLine("*******");
       }
    }
 }

Bu program bende şu çıktıyı verdi:

Assembly: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
Tür sayısı: 2319
*******
Assembly: C:\Documents and Settings\Bekir Oflaz\new2.exe
Tür sayısı: 1
*******

Buradan anlıyoruz ki mscorlib.dll dosyasında tam 2319 tür varmış. Sizdeki .Net Framework sürümüne göre bu sayı değişebilir.

  • Assembly sınıfının static olmayan GetType(string Tür) metodu ilgili assemblydeki belirli bir türü System.Type nesnesi olarak tutar. Örnek:
 using System;
 using System.Reflection;
 class deneme
 {
    static void Main()
    {
       string yol=@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll";
       Assembly nesne=Assembly.LoadFrom(yol);
       Type a=nesne.GetType("System.Console");
       Console.WriteLine(a);
    }
 }

Gördüğünüz gibi türü bağlı olduğu isim alanıyla belirtmemiz gerekir.

Bu kitabın diğer sayfaları
  • Sınıflar
  • Operatör aşırı yükleme
  • İndeksleyiciler
  • Yapılar
  • Enum sabitleri
  • İsim alanları
  • System isim alanı
  • Temel I/O işlemleri
  • Temel string işlemleri
  • Kalıtım
  • Arayüzler
  • Kısmi tipler ve metotlar
  • İstisnai durum yakalama mekanizması
  • Temsilciler
  • Olaylar
  • Önişlemci komutları
  • Göstericiler
  • Assembly kavramı
  • Yansıma
  • Nitelikler
  • Örnekler
  • Şablon tipler
  • Koleksiyonlar
  • yield
  • Veri tabanı işlemleri
  • XML işlemleri
  • Form tabanlı uygulamalar
  • Visual Studio.NET
  • Çok kanallı uygulamalar
  • ASP.NET