Meta Veriler ve Kendiliğinden Açıklayıcı Bileşenler
Geçmişte, bir dilde yazılmış bir yazılım bileşeni (.exe veya .dll) başka bir dilde yazılmış bir yazılım bileşenini kolayca kullanamıyordu. COM bu sorunu çözmeye yönelik bir adım sağladı. .NET, derleyicilerin tüm modüllere ve derlemelere ek bildirim temelli bilgiler yaymasına izin vererek bileşen birlikte çalışabilirliği daha da kolaylaştırır. Meta veriler olarak adlandırılan bu bilgiler, bileşenlerin sorunsuz bir şekilde etkileşim kurmasına yardımcı olur.
Meta veriler, ortak dil çalışma zamanı taşınabilir yürütülebilir (PE) dosyasında veya bellekte depolanan programınızı açıklayan ikili bilgilerdir. Kodunuzu bir PE dosyasına derlediğinizde, meta veriler dosyanın bir bölümüne eklenir ve kodunuz Microsoft ara diline (MSIL) dönüştürülür ve dosyanın başka bir bölümüne eklenir. Bir modülde veya derlemede tanımlanan ve başvuruda bulunan her tür ve üye meta veriler içinde açıklanır. Kod yürütürken, çalışma zamanı meta verileri belleğe yükler ve kodunuzun sınıfları, üyeleri, devralma vb. hakkındaki bilgileri bulmak için buna başvurur.
Meta veriler, kodunuzda tanımlanan her tür ve üyeyi dilden bağımsız bir şekilde açıklar. Meta veriler aşağıdaki bilgileri depolar:
Derlemenin açıklaması.
Kimlik (ad, sürüm, kültür, ortak anahtar).
Dışarı aktarılan türler.
Bu derlemenin bağımlı olduğu diğer derlemeler.
Çalıştırmak için gereken güvenlik izinleri.
Türlerin açıklaması.
Uygulanan ad, görünürlük, temel sınıf ve arabirimler.
Üyeler (yöntemler, alanlar, özellikler, olaylar, iç içe türler).
Öznitelik.
- Türleri ve üyeleri değiştiren ek açıklayıcı öğeler.
Meta Verilerin Avantajları
Meta veriler daha basit bir programlama modelinin anahtarıdır ve Arabirim Tanım Dili (IDL) dosyaları, üst bilgi dosyaları veya herhangi bir dış bileşen başvurusu yöntemi gereksinimini ortadan kaldırır. Meta veriler, .NET dillerinin kendilerini hem geliştirici hem de kullanıcı tarafından görünmeyen dilden bağımsız bir şekilde otomatik olarak tanımlamasını sağlar. Ayrıca, meta veriler özniteliklerin kullanımıyla genişletilebilir. Meta veriler aşağıdaki önemli avantajları sağlar:
Kendi kendini açıklayan dosyalar.
Ortak dil çalışma zamanı modülleri ve derlemeleri kendi kendini açıklar. Modülün meta verileri, başka bir modülle etkileşime geçmek için gereken her şeyi içerir. Meta veriler, COM'da IDL işlevselliğini otomatik olarak sağlar, böylece hem tanım hem de uygulama için tek bir dosya kullanabilirsiniz. Çalışma zamanı modülleri ve derlemeleri işletim sistemine kayıt bile gerektirmez. Sonuç olarak, çalışma zamanı tarafından kullanılan açıklamalar her zaman derlenmiş dosyanızdaki gerçek kodu yansıtır ve bu da uygulama güvenilirliğini artırır.
Dil birlikte çalışabilirliği ve daha kolay bileşen tabanlı tasarım.
Meta veriler, farklı bir dilde yazılmış bir PE dosyasından bir sınıfı devralmak için derlenmiş kodla ilgili gereken tüm bilgileri sağlar. Herhangi bir yönetilen dilde (ortak dil çalışma zamanını hedefleyen herhangi bir dil) yazılmış herhangi bir sınıfın örneğini, açık hazırlama veya özel birlikte çalışabilirlik kodu kullanma konusunda endişelenmeden oluşturabilirsiniz.
Öznitelik.
.NET, derlenmiş dosyanızda öznitelikler olarak adlandırılan belirli meta veri türlerini bildirmenize olanak tanır. Öznitelikler .NET'te bulunabilir ve programınızın çalışma zamanında nasıl davranacağını daha ayrıntılı bir şekilde denetlemek için kullanılır. Ayrıca, kullanıcı tanımlı özel öznitelikler aracılığıyla kendi özel meta verilerinizi .NET dosyalarına yayabilirsiniz. Daha fazla bilgi için bkz . Öznitelikler.
Meta Veri ve PE Dosya Yapısı
Meta veriler .NET taşınabilir yürütülebilir (PE) dosyasının bir bölümünde depolanırken, Microsoft ara dili (MSIL) PE dosyasının başka bir bölümünde depolanır. Dosyanın metaveri bölümü bir dizi tablo ve yığın veri yapısı içerir. MSIL bölümü, MSIL kodu ve PE dosyasının metaveri bölümüne atıfta bulunan metaveri belirteçleri içerir. Örneğin, kodunuzun MSIL'sini görüntülemek için MSIL Ayrıştırıcısı (Ildasm.exe) gibi araçları kullandığınızda meta veri belirteçleriyle karşılaşabilirsiniz.
Metaveri Tabloları ve Yığınlar
Her metaveri tablosu, programınızın öğeleri hakkında bilgi içerir. Örneğin, bir metaveri tablosu kodunuzdaki sınıfları, başka bir tablo alanları, vb. açıklar. Eğer kodunuzda on sınıf varsa, sınıf tablosu her sınıf için bir tane olmak üzere on satır içerir. Metaveri tabloları diğer tablolara ve yığınlara atıfta bulunur. Örneğin, sınıfların metaveri tablosu, metotların tablosuna atıfta bulunur.
Metaveri, ayrıca, dört yığın yapısında bilgi tutar: Dize, blob, kullanıcı dizesi ve GUID. Türleri ve üyeleri adlandırmak için kullanılan tüm dizeler dize yığınında tutulur. Örneğin, bir yöntem tablosu belirli bir yöntemin adını doğrudan saklamaz; bunun yerine, dize yığınındaki yöntem adına işaret eder.
Meta Veri Belirteçleri
Her metaveri tablosunun her satırı, PE dosyasının MSIL bölümünde bir metaveri belirteci tarafından benzersiz olarak tanımlanır. Metaveri belirteçleri, kavramsal olarak MSIL'de kalıcı olarak bulunan ve belirli bir metaveri tablosuna atıfta bulunan işaretçilere benzer.
Metaveri belirteci, dört baytlık bir sayıdır. Üstteki bayt, belirtecin atıfta bulunduğu belirli bir metaveri tablosunu (yöntem, tür vb.) belirtir. Diğer üç bayt, metaveri tablosunda açıklanan programlama öğesine karşılık gelen satırı belirtir. Eğer C# dilinde bir yöntem tanımlayıp bunu bir PE dosyası olarak derlerseniz, PE dosyasının MSIL bölümünde aşağıdaki metaveri belirteci bulunabilir:
0x06000004
Üst bayt (0x06
), bunun bir MethodDef belirteci olduğunu gösterir. Küçük üç bayt (000004
), ortak dil çalışma zamanına method tanımını açıklayan bilgiler için MethodDef tablosunun dördüncü satırına bakmasını söyler.
Bir PE Dosyasının İçindeki Metaveriler
Bir program ortak dil çalışma zamanı için derlendiğinde, üç bölümden oluşan bir PE dosyasına dönüştürülür. Aşağıdaki tabloda her bölümün içeriği açıklanmaktadır.
PE bölümü | PE bölümünün içerikleri |
---|---|
PE üst bilgisi | PE dosyasının ana bölümlerinin ve giriş noktası adresinin dizini. Çalışma zamanı, bu bilgileri, dosyayı bir PE dosyası olarak tanımlamak ve programı belleğe yüklerken yürütmenin nereden başlayacağını belirlemek için kullanır. |
MSIL yönergeleri | Kodunuzu oluşturan Microsoft ara dili (MSIL) yönergeleri. Birçok MSIL yönergesi metaveri belirteçleri ile birlikte bulunur. |
Meta veri | Metaveri tabloları ve yığınlar Çalışma zamanı, bu bölümü, kodunuzdaki tüm türler ve üyeler hakkında bilgi kaydetmek için kullanır. Bu bölüm ayrıca özel öznitelikler ve güvenlik bilgileri de içerir. |
Meta Verilerin Çalışma Zamanında Kullanımı
Meta verileri ve ortak dil çalışma zamanındaki rolünü daha iyi anlamak için basit bir program oluşturmak ve meta verilerin çalışma zamanı ömrünü nasıl etkilediğini göstermek yararlı olabilir. Aşağıdaki kod örneği adlı MyApp
bir sınıfın içinde iki yöntemi gösterir. Main
yöntemi program giriş noktasıdır, yöntem ise Add
yalnızca iki tamsayı bağımsız değişkeninin toplamını döndürür.
Public Class MyApp
Public Shared Sub Main()
Dim ValueOne As Integer = 10
Dim ValueTwo As Integer = 20
Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo))
End Sub
Public Shared Function Add(One As Integer, Two As Integer) As Integer
Return (One + Two)
End Function
End Class
using System;
public class MyApp
{
public static int Main()
{
int ValueOne = 10;
int ValueTwo = 20;
Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo));
return 0;
}
public static int Add(int One, int Two)
{
return (One + Two);
}
}
Kod çalıştırıldığında, çalışma zamanı modülü belleğe yükler ve bu sınıfın meta verilerine başvurur. Yüklendikten sonra çalışma zamanı, hızlı yerel makine yönergelerine dönüştürmek için yöntemin Microsoft ara dili (MSIL) akışının kapsamlı analizini gerçekleştirir. Çalışma zamanı, MSIL yönergelerini yerel makine koduna gerektiğinde bir yönteme dönüştürmek için tam zamanında (JIT) bir derleyici kullanır.
Aşağıdaki örnekte, önceki kodun işlevinden üretilen MSIL'in bir bölümü gösterilmektedir Main
. MSIL Ayrıştırıcısı'nı (Ildasm.exe) kullanarak herhangi bir .NET uygulamasından MSIL ve meta verileri görüntüleyebilirsiniz.
.entrypoint
.maxstack 3
.locals ([0] int32 ValueOne,
[1] int32 ValueTwo,
[2] int32 V_2,
[3] int32 V_3)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldc.i4.s 20
IL_0005: stloc.1
IL_0006: ldstr "The Value is: {0}"
IL_000b: ldloc.0
IL_000c: ldloc.1
IL_000d: call int32 ConsoleApplication.MyApp::Add(int32,int32) /* 06000003 */
JIT derleyicisi yöntemin tamamı için MSIL'yi okur, kapsamlı bir şekilde analiz eder ve yöntem için verimli yerel yönergeler oluşturur. konumunda IL_000d
yöntemi (/*
06000003 */
) için Add
bir meta veri belirteci ile karşılaşılır ve çalışma zamanı, MethodDef tablosunun üçüncü satırına danışmak için belirteci kullanır.
Aşağıdaki tabloda yöntemi açıklayan meta veri belirteci tarafından başvuruda bulunan MethodDef tablosunun bir bölümü gösterilmektedir Add
. Diğer meta veri tabloları bu derlemede mevcut olsa ve kendi benzersiz değerlerine sahip olsa da, yalnızca bu tablo ele alınacaktır.
Satır | Göreli Sanal Adres (RVA) | ImplFlags | Bayraklar | Name (Dize yığınını gösterir.) |
İmza (Blob yığınını gösterir.) |
---|---|---|---|---|---|
1 | 0x00002050 | IL Yönetilen |
Genel ReuseSlot Specialname RTSpecialName Ctor |
.ctor (oluşturucu) | |
2 | 0x00002058 | IL Yönetilen |
Genel Statik ReuseSlot |
Ana | Dize |
3 | 0x0000208c | IL Yönetilen |
Genel Statik ReuseSlot |
Ekle | int, int, int |
Tablonun her sütunu kodunuz hakkında önemli bilgiler içerir. RVA sütunu, çalışma zamanının bu yöntemi tanımlayan MSIL'nin başlangıç bellek adresini hesaplamasına olanak tanır. ImplFlags ve Flags sütunları, yöntemi açıklayan bit maskeleri içerir (örneğin, yöntemin genel mi yoksa özel mi olduğu). Ad sütunu, dize yığınından yönteminin adını dizine alır. signature sütunu blob yığınında yöntemin imza tanımını dizine alır.
Çalışma zamanı, üçüncü satırdaki RVA sütunundan istenen uzaklık adresini hesaplar ve bu adresi JIT derleyicisine döndürür ve ardından yeni adrese gider. JIT derleyicisi, başka bir meta veri belirteci ile karşılaşana ve işlem yinelenene kadar MSIL'i yeni adreste işlemeye devam eder.
Meta verileri kullanarak çalışma zamanı, kodunuzu yüklemek ve yerel makine yönergelerinde işlemek için gereken tüm bilgilere erişebilir. Bu şekilde meta veriler, kendi kendini açıklayan dosyaları ve ortak tür sistemiyle birlikte diller arası devralmayı etkinleştirir.
İlgili Konular
Başlık | Açıklama |
---|---|
Öznitelikler | Özniteliklerin nasıl uygulanacağını, özel özniteliklerin nasıl yazıldığını ve özniteliklerde depolanan bilgilerin nasıl alınacağını açıklar. |