C# CIL, Metadata, Manifest Kavramları ve “ildasm.exe”
CIL ( Common Intermediate Language ) daha önce yazdığım C# CLR, CLS, MSIL Nedir? yazımda bahsettiğim MSIL ( Microsoft Intermediate Langugage ) kavramının aynısıdır. Sadece bu kavramın ismi değişmiştir. CIL ve MSIL hakkında daha geniş bilgiye yukarıda belirttiğim yazıdan yine ulaşabilirsiniz.
CIL yazdığımız programı derlememiz sonucunda oluşan işlemciden bağımsız komut setidir. İşlemciden bağımsız olması CIL’in platform bağımsız olduğunu gösterir. Hangi platformda derlenirse derlensin sonucunda oluşan CIL hep ayni olacaktır. Bu CIL çalıştırılabilir bir kod değildir. En basit anlatımla JIT ile JIT’in çalıştırıldığı platforma göre yorumlanarak çalıştırılabilir bir hale gelecektir.
CIL ve diğer kavramları incelemek için önce C# ile örnek bir program yazalım:
// Calc.cs
using System;
namespace CalculatorExample
{
// This class contains the app's entry point.
class Program
{
static void Main()
{
Calc c = new Calc();
int ans = c.Add(10, 84);
Console.WriteLine("10 + 84 is {0}.", ans);
// Wait for user to press the Enter key before shutting down.
Console.ReadLine();
}
}
// The C# calculator.
class Calc
{
public int Add(int x, int y)
{ return x + y; }
}
}
Bu program derlendikten sonra oluşan eğer bir kütüphane ise *.dll dosyası veya console application ise *.exe dosyaları CIL, metadata ve manifest içerir.
Şekil – 1 : mscoree.dll ile derlenen kod şeması
Şimdi bu kavramları derlediğimiz örnek program üzerinden giderek açıklayalım. Bir dll veya exe dosyasının içinde bulunan CIL, metadata ve manifest Visual Studio’nun bir tool’u olan “ildasm” ile görüntülenebilir. Bu tool’a ulşamak için Visual Studio Command Prompt’a “ildasm” yazıp Enter’a basmanız yeterlidir. Bu tool üzerinden File –> Open diyerek yukarıda yazdığımız programın çalışması sonucu oluşan “Calc.exe” dosyasını açarsak bu dosyanın içerisinde bulunan yukarıda bahsettiğimiz CIL, metadata ve manifest kavramlarını görebiliriz.
Şekil – 2 : ildasm programının ekran görüntüsü
CIL Kodu Görüntüleme
Çalıştırdığımız ildasm.exe içerisinde bulunan Main : void() metoduna çift tıkladığımızda o Calc.exe dosyamızın içerisinde bulunan CIL kodunu görüntüleyebiliriz.
Şekil – 3 : CIL Kodu
Type Metadata Kavramı ve Type Metadata Görüntüleme
Önce programımızın Type Metadatasına nasıl ulaşabiliriz ona bakalım ardından da bu kodun programımız için ne ifade ettiğine bakalım. İlk işlem olan Type Metadata görüntülemesi için ildasm.exe üzerindeyken Ctrl + M tuşlarına basmamız yeterlidir. Bu bize Calc.exe programımızın içerisindeki Type Metadata bilgisini gösteren bir pencere açaçaktır.
Şekil – 4 : Type Metadata
Peki bu Type Metadata programımız için ne ifade ediyor şimdi bu soruya gelelim. Bu konuyla ilgili daha geniş bir bilgiyi ileride paylaşacağım ama şimdilik en basit anlamıyla. Metadata program içerisinde tanımladığımız tüm değişken bilgilerini içerir. Örneğin biz bu programda bir CalculatorExample class’ı tanımladık. Bu class tanımı Type Metadata’da tutulmaktadır. Bunun gibi class, structure, enumaration v.b. gibi tanımlamalar ve bunların içerisinde tanımlanan property’ler, event’lar, metotların hepsinin bilgisi Type Metadata içerisinde bulunmaktadır. Örneğin Visual Studio’nun en büyük avantajlarından saydığımız IntelliSense’de bu metadata bilgisini kullanmaktadır. Ayni zamanda debug ederken, compile ederken v.s. gibi önemli işler hep Type Metadata’dan yararlanmaktadır.
Manifest ( Assembly Metadata ) Kavramı ve Görüntüleme
Son olarak exe’mizin içerisindeki Manifest bilgisini görüntülemek için yine ildasm tool’unu kullanmamız yeterlidir. Bu tool ile bir exe açtığımızda karşımıza çıkan ekrandaki MANIFEST yazan sekmeye çift tıkladığımızda exe’mizin manifest dosyasına ulaşmış oluruz.
Şekil – 5 : Manifest
Kısaca Manifest’in görevi assembly versiyon numarası, copyright bilgisi gibi özelliklerini tutar. Yine Manifest hakkında daha detaylı bilgiyi ileride yazacağım için bunuda kısaca geçiyorum.
Sonuç olarak bir program derlendikten sonra oluşan eğer bir kütüphane ise *.dll dosyası veya console application ise *.exe dosyaları CIL, metadata ve manifest içerir. Bu kavramların her birinin ayrı bir görevi vardır ve bunların görevlerini ve derlediğimiz programlarda bunlara nasıl ulaşabileceğimizi yukarıda kısaca işledik.
Kaynaklar : Apress Yayınları : Pro C# 2010 and the .NET 2010 Platform
0 yorum :
Yorum Gönder