| 
                
             | 
        
        
            
                
                    
                        | 
                            Assembly, ILDASM.exe ve GACUTIL.exe Hakkında | 
                        
                             | 
                                
                     
                    
                        
                            
	
    
		
            | Gönderiliyor lütfen bekleyin... |   
        
	 
    
 
                         | 
                     
                 
             | 
        
        
            
                
                 
  Bu makalede kavram olarak en çok karıştırılan ve anlaşılması diğer konulara 
  göre zor olan Assembly kavramını ve Visual Studio ile birlikte gelen GACUTIL 
  ve ILDASM gibi önemli araçları inceleyecegiz. 
   
  Asembly Nedir? 
   
    Hemen ilk başta belirtelim ki bu makalede bahsedeceğimiz Assembly'nin 
  alt seviye bir programlama dili olan Assembly ile yakından uzaktan hiçbir alakası 
  yoktur. Sadece bir isim benzerliği vardır. .NET platformunda yazdığımız kodlar 
  sonucunda oluşturduğumuz bütün .exe uzantılı dosyalara ve .dll uzantılı dosyalara 
  genel olarak Assembly denilmektedir. Projemize ait derlenmiş kodlar ve metadata 
  dediğimiz bir takım özniteleyici kodlar Assembly'ler içerisinde bulunur. Assembly'lerin 
  kabaca özellikleri aşağıdaki gibi sıralanabilir. 
   
  1-) Assembly'lerde metadata denilen veriler, Assembly'deki tür bilgileri ve başka 
  kaynaklarla olan bağlantılar saklanır. 
   
   2-) Assembly'de(dll yada exe) kendilerine ait versiyon bilgisi tutulur. Hatırlarsanız 
  klasik dll ve exe tipi dosyalarda versiyon bilgisi saklanmadığı için çeşitli uyumsuzluklar 
  yaşanabilmekteydi. Mesela farklı iki firmanın hazırladığı dll 'ler aynı isimli 
  olduğunda sonradan register edilen dll halihazırda bulunan dll 'in üzerinde yazıldığı 
  için sistemde bulunan bazı uygulamalarda sorun çıkıyordu. Dll 'ler bu 
  tür sorunlara yol açtığı için DLL Hell (Dll cehennemi) kavramı ortaya çıkmıştı. Aslında 
  COM dll 'leri ile bu sorun bir nebze ortadan kalkmışsa da asıl çözüm Assembly'ler 
  ile gelmiştir.  
   
    3-) Assembly'lerde versiyon bilgisi saklandığı için bir uygulama 
  içerisinde farklı versiyonlara sahip Assembly'leri kullanabiliriz.  
   
  4-) Program kurma işlemi, Assembly 'ye ilişkin dosyayı direkt kopyalayarak yapılabilir. 
  Eski sistemde DLL 'lerin register edilmesi gerekiyordu. 
   
   Assembly'lerin en önemli özelliklerinden birisi de Application Domain 
  dediğimiz kavramdır. Application Domain sayesinde bir proses içinde birden fazla 
  birbirinden bağımsız çalışan Assembly 'yi çalıştırma imkanına kavuşuruz. Bu konuya 
  açıklayıcı bir örnek olması açısından aşağıdaki örneği inceleyebilirsiniz. 
  Bu örnekte iki tane Console uygulaması yapacağız. Bu iki uygulamaya ait çalışır 
  durumdaki dosyalara artık Assembly diyebilirsiniz. Aşağıdaki ilk örnekte Main 
  işlevi içerisinde ekrana bir yazı yazdırıyoruz. 
  
  
   
     
      //assembly1.cs 
         
        using System; 
        namespace assembly1 
        {
  
           class 
        csnedir1 
            { 
         
                static 
        void Main(string[] args) 
                { 
                    Console.WriteLine("Beni 
        disardan yüklediler."); 
                } 
            } 
        }
  
     | 
   
 
Bu 
  programı notepad 'da yazıp derledikten sonra komut satırında "csc assembly1.cs" 
  yazıp assmbly1.exe dosyasını oluşturun. Aynı klasör içine şimdi aşağıdaki assembly2.cs 
  dosyasını oluşturun ve derleyerek assembly2.exe 'nin oluşmasını sağlayın. 
  
  
   
     
      //assembly2.cs 
         
        using System; 
        namespace assembly2 
        {
  
           class 
        csnedir2 
            { 
         
                static 
        void Main(string[] args) 
                { 
                    AppDomain 
        apd2 = AppDomain.CreateDomain("Csnedir"); 
                    apd2.ExecuteAssembly("assembly1.exe"); 
                } 
            } 
        }
  
     | 
   
 
 
   Yukarıda da bahsettiğim gibi Application Domain sayesinde bir uygulama içerisine 
  değişik assembly'ler yüklenebilir ve çalıştırılabilir. Application Domian kavramını 
  System isim alanında bulunan AppDomain sınıfı temsil eder. Yeni bir Application 
  Domain'i oluşturmak için AppDomain sınıfının overload (aşırı yüklenmiş)edilmiş 
  CreateDomain statik üye fonksiyonları kullanılır. AppDomain sınıfının ExecuteAssembly 
  fonksiyonuyla dışarıdan yeni bir Assembly yüklenir ve o satırdan itibaren yüklenen 
  assembly çalıştırılır. (Yukarıdaki örnekte iki Assembly'nin de aynı klasörde 
  olmasına dikkat edin.) 
   
         Assembly hakkında bu geniş 
  giriş bilgisini verdikten sonra Assembly'nin fiziksel yapısından bahsedelim biraz. 
  Bir Assembly belgesinde Assembly metadata, tür(type) metadata, kaynaklar ve IL(Intermadiate 
  Language) kodu bulunur. Bütün bu yapılar bir Assembly dosyasında 
  bulunabileceği gibi Assembly metadata'lar sayesinde dışarıdaki kaynaklara referans da verilebilir. 
  Assembly'lerin en önemli yapısı Manifest dediğimiz parçasıdır. Manifest assembly 
  metadata'lar bulunur. Peki nedir bu Assembly metadata'lar? Bir Asembly adı, versiyonu gibi 
  kimlik bilgileri, ilgili Assembly ile ilgili olan diğer dosyalar, başka Assembly'lere olan 
  referanslar gibi bilgilerin tamamına Assembly metadata denir. İşte bu bilgilerin oluşturduğu 
  kümeye Manifest  denilmektedir. Assembly'lerin Manifest bölümünde bulunan 
  elemanlar temel olarak aşağıdaki tabloda verilmiştir. 
   
  
  
   
    | Özellik | 
    Anlamı | 
   
   
    | AssemblyCompany | 
     
      Assembly'nin firma bilgisi | 
   
   
    | AssemblyCopyright | 
    Copyright 
      bilgisi | 
   
   
    | AssemblyCulture | 
     
      İlgili Assembly'ye ait kültür bilgisi(Almanya,İngiltere,Türkiye vs..) | 
   
   
    | AssemblyDelaySign | 
    Gecikmeli 
      imzanın olup olmayacağı (True ya da False) | 
   
   
    | AssemblyDescription | 
    Assembly 
      ile ilgili kısa açıklama | 
   
   
    | AssemblyFileVersion | 
    Win32 
      sistemindeki dosya versiyonu | 
   
   
    | AssemblyInformationalVersion | 
    CLR 
      tarafından kullanılmayan ve okunabilirliği yüksek olan versiyon bilgisi | 
   
   
    | AssemblyKeyFile | 
     
      Assembly'nin kayıt edilmesi için gereken anahtarın bulunduğu dosya | 
   
   
    | AssemblyKeyName | 
    Kayıt 
      için gereken anahtar sözcük | 
   
   
    | AssemblyProduct | 
    Ürün 
      adı  | 
   
   
    | AssemblyTitle | 
    Assembly'nin 
      adı  | 
   
   
    | AssemblyTrademark | 
    Trademark 
      bilgisi | 
   
   
    | AssemblyVersion | 
    String 
      şeklindeki Version numarası | 
   
 
Bu tablo MSDN kitaplığından 
alınmıştır 
 
 
       Assembly'ler private ve shared olmak üzere ikiye 
  ayrılır. Bunları detaylı olarak açıklamaya başlamadan önce Assembly'leri görüntülemek 
  için kullanılan ILDASM.exe aracını inceleyelim. ILDASM.exe MSIL kodu içeren 
  assembly dosyalarını okur ve kullanışlı bir arayüz ile kullanıcıya sunar. 
  ILDASM.exe programını çalıştırmak için komut satırına ILDASM.exe yazmamız yeterlidir. 
  Açılacak pencereden File->Open menüsünü kullanarak görüntülemek istediğiniz Assembly 
  dosyasını seçin.(Aşağıda gördüğünüz ekran görüntüleri Assembly2.exe'nin görüntüleridir.) Bir 
  assembly'deki türler, sınıflar, fonksiyonlar çeşitli sembollerle temsil edilmiştir. Hangi 
  sembollerin ne anlama geldiğini MSDN kitaplığından bulabilirsiniz. 
   
    
   
   
  Şimdi
  de açılacak pencereden Main bölümüne tıklayın, ve aşağıdaki görüntüyü elde 
  edin. Buradaki bütün kodlar IL kodudur. 
   
    
   
  Diğer bölümlerde tıklayarak IL kodlarını inceleyebilirsiniz. 
   
   
   
        Yukarıda bahsettiğimiz gibi Assembly'ler private 
  ve shared olmak üzere ikiye ayrılır. Normal olarak geliştirilen Assembly'ler 
  private Assembly olarak adlandırılır. Bu tür assembly'ler uygulama ile aynı dizinde ya da 
  alt dizinlerde bulunur. Versiyon ve isim uyuşmazlığı sorunu bu tür assembly'lerde 
  olmamaktadır. Shared assembly'ler ise daha çok büyük projelerde mesela bir projenin bir firmaya 
  ait farklı ofislerinde gerçekleştirildiği durumlarda kullanılır. Bu durumda 
  assembly'lerin uyması gereken bazı kurallar vardır. Bunlardan en önemlisi strong name 
  dediğimiz tekil bir isme sahip olmasıdır. Bu sayede shared assembly'ler tekil olduğu için 
  bir sistemde global düzeyde işlem görürler. Yani farklı farklı uygulamalardan 
  aynı anda shared assembly'lere ulaşılabilir. Şimdi shared assembly kavramını 
  biraz açalım. 
   
  Shared Assembly 
   
    Assembly'ler varsayılan olarak private'tır. Bu yüzden bu tür Assembly'ler 
  sadece bulundukları dizin içerisindeki uygulamalar tarafından görülür ve çalıştırılırlar. 
  Oysa ki bazı durumlarda bütün programlar tarafından o Assembly'ye birbirlerinden 
  bağımsız olarak erişilmesini isteriz. Bunu sağlamak için Global Assembly 
  Cache   denilen bir sistemden faydalanacağız. .NET 'in yüklü olduğu 
  bütün sistemlerde Assembly Cache mekanizması vardır. Bu Assembly Cache'ye yüklü olan 
  Assembly'ler bütün uygulamalar tarafından kullanılabilir. Bir assembly'yi GAC'a(Global Assembly 
  Cache) yüklemek için 3 yöntem kullanılır: 
   
   - Assembly'leri Windows Installer 2.0 ile yüklemek 
  - Gacutil.exe isimli .NET ile gelen aracı kullanmak 
  - /assembly 'ye Assembly dosyasını kopyalamak (C:\winnt\assembly\) 
   
   Şimdi adım adım bir shared assembly oluşturmayı görelim. Bunun için ikinci 
  yöntemi kullanacağım. Başlangıç olarak gacutil.exe programı hakkında bilgi vermek 
  istiyorum. Gacutil(global assembly cache utility) programı .NET ile birlikte gelir. 
  Assembly cache'ye yeni assembly yüklemek varolan assembly'leri listelemek ve silmek için 
  kullanılır. Komut satırından aşağıdaki parametrelerle bu programı çalıştırabiliriz. 
   
   * gacutil /l ---> GAC 'da bulunan bütün assembly'leri listeler. 
  * gacutil /i assemblydll---> assemblydll adlı shared assembly'yi GAC 'a yükler. 
  * gacutil /u assemblydll---> assemblydll adlı shared assembly GAC 'dan siler. 
   
   İlk adım olarak bütün shared assembly'lere strong name dediğimiz bir isim vermeliyiz. 
  GAC 'da bulunan bütün assembly'lerin farklı bir adı vardır. COM teknolojisindeki 
  globally unique identifier(GUID) 'e benzetebiliriz bu isimleri. Peki bu strong 
  name 'leri nasıl oluşturacağız? Bu iş için yine .NET ile birlikte gelen sn.exe 
  adlı aracı kullanacağız. sn programı aşağıdaki gibi kullanılarak bir 
  tekil isim oluşturulur ve anahtar.snk adlı dosyaya yazılır. 
   
  sn -k anahtar.snk 
   
  anahtar.snk dosyasını oluşturduktan sonra bu anahtar ismi projemizdeki AssemblyInfo.cs 
  dosyasındaki manifeset bölümüne ekliyoruz. Yani AssemblyKeyFile özelliğini anahtar.snk 
  olarak değiştiriyoruz. Sonuç olarak AssemblyInfo.cs dosyası aşağıdaki gibi olacaktır. 
   
  ............... 
  [assembly AssemblyDelaySign(false)]  
  [assembly AssemblyKeyFile("../../anahtar.snk")] 
  [assembly AssemblyKeyName("")]  
  ...............  
   
  Bu işlemleri yaptıktan sonra projeyi "Build" edip oluşan Assembly 
  dosyasını gacutil.exe yardımıyla GAC 'a ekliyoruz. Bu işlemi komut satırından 
  aşağıdaki gibi yapmalıyız. 
   
  gacutil /i Assembly1.dll 
   
   Bu
   işlemi yaptıktan sonra shared olan bu assembly'ye 
istediğimiz .NET projesinden ulaşabiliriz. Tabiproject->Add reference menüsünden 
shared assembly'ye referans verdikten sonra yapabiliriz bunu. Shared assembly 
olduğu için yeni bir projede bu assembly kullandığımız da lokal bir 
kopyası oluşturulmaz dolayısıyla GAC üzerinden erişilir. 
  Kaynaklar
  C# Primer (A Practical Approach) - Stanley 
Lipman MSDN Kütüphanesi
              
          
             
            
   
  
                
                Makale: 
                Assembly, ILDASM.exe ve GACUTIL.exe Hakkında C#, Visual C# ve .NET Sefer Algan 
             | 
        
        
            | 
             | 
        
        
            | 
                 
             | 
        
        
            
                
                
                    
                        - 
                            
                        
 
                        - 
                            
Eklenen Son 10  
                         
                        - 
                            
Bu Konuda Geçmiş 10 
                         
                     
                    
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                        
                            Son Eklenen 10 Makale Yükleniyor
                         
                        
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         
                     
                 
                
                
             | 
        
        
            | 
                
             |