Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 26.1.2003
Okunma Sayısı : 41801
Yorum Sayısı : 3     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 21.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Assembly, ILDASM.exe ve GACUTIL.exe Hakkında
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
EYL
27
2005
Şiir gibi bir anlatım... Teşekkürler... Teşekkürler... Teşekkürler...
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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