Aracılığıyla paylaş


.NET Native ve derleme

.NET Framework'i hedefleyen Windows masaüstü uygulamaları belirli bir programlama dilinde yazılır ve ara dilde (IL) derlenir. Çalışma zamanında, tam zamanında (JIT) derleyici, bir yöntem ilk kez yürütülmeden hemen önce IL'yi yerel makine için yerel koda derlemekten sorumludur. Buna karşılık, .NET Native araç zinciri kaynak kodunu derleme zamanında yerel koda dönüştürür. Bu makalede .NET Native, .NET Framework uygulamaları için sağlanan diğer derleme teknolojileriyle karşılaştırılır ve .NET Native'in .NET Native ile derlenen kodda oluşan özel durumların neden JIT ile derlenmiş kodda oluşmadığını anlamanıza yardımcı olabilecek yerel kodu nasıl ürettiğine ilişkin pratik bir genel bakış sağlanır.

Yerel binarileri oluşturma

.NET Framework'ün hedeflendiği ve .NET Native araç zinciri kullanılarak derlenmeyen bir uygulama, aşağıdakileri içeren uygulama derlemesini içerir:

  • Derlemeyi, bağımlılıklarını, içerdiği türleri ve üyelerini açıklayan meta veriler . Meta veriler, yansıtma ve geç bağlı erişim için, bazı durumlarda ise derleyici ve derleme araçları tarafından kullanılır.

  • Uygulama kodu. Bu, ara dil (IL) işlem kodlarından oluşur. Çalışma zamanında, JIT (tam zamanında) derleyicisi bunu hedef platform için yerel koda çevirir.

Ana uygulama derlemesine ek olarak, bir uygulama aşağıdakilerin mevcut olmasını gerektirir:

  • Uygulamanızın gerektirdiği tüm ek sınıf kitaplıkları veya üçüncü taraf derlemeleri. Bu derlemeler benzer şekilde derlemeyi, türlerini ve üyelerini açıklayan meta verilerin yanı sıra tüm tür üyelerini uygulayan IL'yi içerir.

  • .NET Framework Sınıf Kitaplığı. Bu, .NET Framework yüklemesi ile yerel sistemde yüklü derlemelerden oluşan bir koleksiyondur. .NET Framework Sınıf Kitaplığı'na dahil edilen derlemeler tam bir meta veri kümesi ve uygulama kodu içerir.

  • Ortak Dil Çalışma Zamanı (CLR) Bu, derleme yükleme, bellek yönetimi ve çöp toplama, özel durum işleme, tam zamanında derleme, uzaktan iletişim ve birlikte çalışma gibi hizmetleri gerçekleştiren dinamik bağlantı kitaplıklarından oluşan bir koleksiyondur. Sınıf kitaplığı gibi çalışma zamanı da .NET Framework yüklemesinin bir parçası olarak yerel sisteme yüklenir.

Uygulamanın başarıyla yürütülebilmesi için ortak dil çalışma zamanının tamamının yanı sıra uygulamaya özgü bütünleştirilmiş kodlar, üçüncü taraf derlemeler ve sistem derlemelerindeki tüm türler için meta veriler ve IL'nin mevcut olması gerektiğini unutmayın.

Tam zamanında derleme

.NET Native araç zincirinin girişi, C# veya Visual Basic derleyicisi tarafından oluşturulan UWP uygulamasıdır. Başka bir deyişle, dil derleyicisi bir UWP uygulamasını derlemeyi bitirdiğinde .NET Native araç zinciri yürütülmeye başlar.

Tavsiye

.NET Native girişi yönetilen derlemelere yazılan IL ve meta veriler olduğundan, derleme öncesi veya derleme sonrası olayları kullanarak ya da MSBuild proje dosyasını değiştirerek özel kod oluşturma veya diğer özel işlemleri gerçekleştirmeye devam edebilirsiniz.

Ancak, IL'yi değiştiren ve böylece .NET araç zincirinin bir uygulamanın IL'sini analiz etmesini engelleyen araç kategorileri desteklenmez. Gizleyiciler, bu türdeki en önemli araçlardır.

Bir uygulamayı IL'den yerel koda dönüştürme işlemi boyunca .NET Native araç zinciri aşağıdaki gibi işlemler gerçekleştirir:

  • Belirli kod yolları için yansıma ve meta verileri kullanan kodu statik yerel kodla değiştirir. Örneğin, bir değer türü ValueType.Equals yöntemini geçersiz kılmazsa, varsayılan eşitlik testi değer türünün alanlarını temsil eden FieldInfo nesneleri almak için yansıma kullanır ve ardından iki örneğin alan değerlerini karşılaştırır. Yerel koda derleme yaparken, .NET Native araç zinciri yansıma kodunu ve meta verileri alan değerlerinin statik bir karşılaştırmasıyla değiştirir.

  • Mümkün olduğunda tüm meta verileri ortadan kaldırmaya çalışır.

  • Son uygulama derlemelerinde yalnızca uygulama tarafından gerçekten çağrılan uygulama kodunu içerir. Bu özellikle üçüncü taraf kitaplıklarındaki ve .NET Framework Sınıf Kitaplığı'ndaki kodu etkiler. Sonuç olarak, bir uygulama artık üçüncü taraf kitaplıklarına veya tam .NET Framework Sınıf Kitaplığına bağımlı değildir; bunun yerine, üçüncü taraf ve .NET Framework sınıf kitaplıklarındaki kod artık uygulamada yereldir.

  • Tüm CLR'yi, öncelikle çöp toplayıcıyı içeren yeniden yapılandırılmış bir çalışma zamanı ile değiştirir. Yeniden düzenlenmiş çalışma zamanı, uygulama için yerel olan ve yalnızca birkaç yüz kilobayt boyutunda mrt100_app.dll adlı bir kitaplıkta bulunur. Statik bağlama, ortak dil çalışma zamanı tarafından gerçekleştirilen hizmetlerin birçoğuna olan ihtiyacı ortadan kaldırdığından bu mümkündür.

    Uyarı

    .NET Native, standart ortak dil çalışma zamanıyla aynı çöp toplayıcıyı kullanır. .NET Yerel çöp toplayıcısında arka plan çöp toplama varsayılan olarak etkindir. Çöp toplama hakkında daha fazla bilgi için bkz. Çöp Toplamanın Temelleri.

Önemli

.NET Native, bir uygulamanın tamamını yerel bir uygulamaya derler. Yerel koda sınıf kitaplığı içeren tek bir derleme oluşturmanıza ve bu derlemeyi yönetilen koddan bağımsız olarak çağırmanıza izin vermez.

.NET Native araç zinciri tarafından üretilen uygulama, proje dizininizin Hata Ayıklama veya Yayın dizininde ilc.out adlı bir dizine yazılır. Aşağıdaki dosyalardan oluşur:

  • appName.exe, 'deki bir saplama yürütülebilir dosyadır; bu dosya, appName.dll'da özel bir dışarı aktarımına denetimi aktarır.

  • <appName>.dll, tüm uygulama kodunuzun yanı sıra .NET Framework Sınıf Kitaplığı'ndan ve bağımlılığınız olan üçüncü taraf kitaplıklarından gelen kodu içeren bir Windows dinamik bağlantı kitaplığıdır. Ayrıca, Windows ile birlikte çalışmak ve uygulamanızdaki nesneleri seri hale getirmek için gereken kod gibi destek kodunu içerir.

  • mrt100_app.dll, atık toplama gibi çalışma zamanı hizmetleri sağlayan yeniden düzenlenmiş bir çalışma zamanı.

Tüm bağımlılıklar uygulamanın APPX bildirimi tarafından yakalanır. Doğrudan appx paketinde paketlenmiş olan exe, dll ve mrt100_app.dlluygulamalarına ek olarak, bu iki dosya daha içerir:

  • msvcr140_app.dll, mrt100_app.dll'in kullandığı C çalışma zamanı (CRT) kitaplığıdır. Paket, bir çerçeve referansı ile eklenir.

  • mrt100.dll. Bu kitaplık, mrt100_app.dllperformansını geliştirebilen işlevler içerir, ancak yokluğu mrt100_app.dll çalışmasını engellemez. Varsa yerel makinedeki system32 dizininden yüklenir.

.NET Yerel araç zinciri uygulama kodunu uygulamanıza bağladığından, yalnızca uygulamanızın bu kodu gerçekten çağırdığını biliyorsa, aşağıdaki senaryolarda gereken meta veriler veya uygulama kodu uygulamanıza dahil edilmeyebilir:

  • Yansıma.

  • Dinamik veya geç bağlı çağrı.

  • Serileştirme ve seri durumdan çıkarma.

  • COM birlikte çalışma.

Çalışma zamanında gerekli meta veriler veya uygulama kodu yoksa, .NET Native çalışma zamanı bir istisna fırlatır. Bu özel durumları önleyebilir ve .NET Native araç zincirinin gerekli meta verileri ve uygulama kodunu içerdiğinden emin olmak için çalışma zamanı yönergeleri dosyası, meta verileri veya uygulama kodunu çalışma zamanında kullanılabilir olması gereken program öğelerini atayan ve onlara bir çalışma zamanı ilkesi atayan bir XML dosyası kullanabilirsiniz. Aşağıda, .NET Native araç zinciri tarafından derlenen bir UWP projesine eklenen varsayılan çalışma zamanı yönergeleri dosyası verilmiştir:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
  </Application>
</Directives>

Bu işlev, uygulama paketinizdeki tüm derlemelerde yer alan tüm türler ve üyeler için yansıtma ve dinamik çağırma işlemlerini etkinleştirir. Ancak, .NET Framework Sınıf Kitaplığı derlemelerinde türlerin yansıtılmasını veya dinamik olarak etkinleştirilmesini sağlamaz. Çoğu durumda, bu yeterlidir.

Ayrıca bakınız