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 ortak ara dile (CIL) 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çıklanmıştı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).

  • Öznitelikler.

    • 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, IDL'nin COM'daki 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, bir sınıfı farklı bir dilde yazılmış bir PE dosyasından 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 sıralama veya özel birlikte çalışabilirlik kodu kullanma konusunda endişelenmeden oluşturabilirsiniz.

  • Öznitelikler.

    .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ı olarak 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 bir .NET taşınabilir yürütülebilir (PE) dosyasının bir bölümünde, ortak ara dil (CIL) ise 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. CIL bölümü, PE dosyasının meta veri bölümüne başvuran CIL ve meta veri belirteçleri içerir. Örneğin, kodunuzun CIL'sini görüntülemek için IL Ayrıştırıcı (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 meta veri tablosunun her satırı, PE dosyasının CIL bölümünde bir meta veri belirteci tarafından benzersiz olarak tanımlanır. Meta veri belirteçleri kavramsal olarak CIL'de kalıcı olan ve belirli bir meta veri tablosuna başvuran 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. C# dilinde bir yöntem tanımlayıp bir PE dosyasında derlerseniz, PE dosyasının CIL bölümünde aşağıdaki meta veri belirteci olabilir:

0x06000004

Üst bayt (0x06), bunun bir MethodDef belirteci olduğunu gösterir. Küçük üç bayt (000004), ortak dil çalışma zamanına MethodDef tablosunun dördüncü satırında bu yöntem tanımını açıklayan bilgileri araması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.
CIL yönergeleri Kodunuzu oluşturan Microsoft ara dil yönergeleri (CIL). Birçok CIL yönergelerine meta veri belirteçleri eşlik eder.
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ğinde adlı MyAppbir sınıfın içinde iki yöntem gösterilmektedir. 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 ortak ara dil (CIL) akışını kapsamlı bir şekilde analiz eder. Çalışma zamanı, CIL yönergelerini gerektiğinde yerel makine koduna 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 CIL'nin bir bölümü gösterilmektedir Main . CIL Ayrıştırıcısı'nı (Ildasm.exe) kullanarak herhangi bir .NET uygulamasından CIL 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 CIL'yi okur, kapsamlı bir şekilde analiz eder ve yöntemi için verimli yerel yönergeler oluşturur. adresinde IL_000dyö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österilmektedirAdd. Diğer meta veri tabloları bu derlemede mevcut olsa ve kendi benzersiz değerlerine sahip olsa da, yalnızca bu tablo tartışılır.

Satır Göreli Sanal Adres (RVA) ImplFlags Bayraklar Veri Akışı Adı

(Dize yığınını gösterir.)
İmza (Blob yığınını gösterir.)
1 0x00002050 IL

Yönetilen
Genel

Yeniden Kullanım Grafiği

Specialname

RTSpecialName

.ctor
.ctor (oluşturucu)
2 0x00002058 IL

Yönetilen
Genel

Statik

Yeniden Kullanım Grafiği
Ana String
3 0x0000208c IL

Yönetilen
Genel

Statik

Yeniden Kullanım Grafiği
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 CIL'nin başlangıç bellek adresini hesaplamasına olanak tanır. ImplFlags ve Flags sütunları, yöntemini açıklayan bit maskeleri içerir (örneğin, yöntemin genel mi yoksa özel mi olduğu). Name 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ı, istenen uzaklık adresini üçüncü satırdaki RVA sütunundan 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 CIL'yi yeni adreste işlemeye devam eder.

Çalışma zamanı, meta verileri kullanarak 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.