Aracılığıyla paylaş


Yönetilen derleme yükleme algoritması

Yönetilen derlemeler, çeşitli aşamalara sahip bir algoritma ile bulunur ve yüklenir.

Uydu derlemeleri ve WinRT derlemeler dışındaki tüm yönetilen derlemeler aynı algoritmayı kullanır.

Yönetilen derlemeler ne zaman yüklenir?

Yönetilen derleme yükünü tetiklemenin en yaygın mekanizması statik derleme başvurusudur. Bu başvurular, kod başka bir derlemede tanımlanan bir tür kullandığında derleyici tarafından eklenir. Çalışma zamanı gerektiğinde bu derlemeleri yükler (load-by-name). Statik derleme referanslarının tam olarak ne zaman yükleneceği belirtilmemektedir. Çalışma zamanı sürümleri arasında farklılık gösterebilir ve inlining gibi iyileştirmelerden etkilenir.

Aşağıdaki API'lerin doğrudan kullanımı yükleri de tetikler:

Uygulama Programlama Arayüzü (API) Açıklama Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Bu örnek.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Yoldan yükleyin. Bu örnek.
AssemblyLoadContext.LoadFromStream Nesneden yükle. Bu örnek.
Assembly.LoadFile Yeni AssemblyLoadContext bir örnekte yoldan yükleme Yeni AssemblyLoadContext örnek.
Assembly.LoadFrom Örnekteki AssemblyLoadContext.Default yoldan yükleyin.
AppDomain.AssemblyResolve işleyici ekler. İşleyici, derlemenin bağımlılıklarını dizininden yükler.
AssemblyLoadContext.Default örneği.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Arayandan çıkarsanan.
Yöntemleri tercih edin AssemblyLoadContext .
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Yeni AssemblyLoadContext örneğine nesne üzerinden yükleyin. Yeni AssemblyLoadContext örnek.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Arayandan çıkarsanan.
Type.GetType bağımsız değişkeni kullanan yöntemleri tercih edin assemblyResolver.
Assembly.GetType Tür name, derleme ile nitelenmiş bir genel türü açıklıyorsa, bir Load-by-name tetikleyin. Arayandan çıkarsanan.
Derleme nitelikli tür adlarını kullanırken Type.GetType tercih edin.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Arayandan çıkarsanan.
Bağımsız değişken alan Activator.CreateInstance yöntemleri tercih edinType.

Önemli

.NET Framework'ün aksine, .NET'te assemblyFile parametresi Assembly.LoadFrom bir URI olarak değil, dosya yolu olarak değerlendirilir. .NET Framework'te, bir dosya URI'sini (örneğin, file:///C:/path/to/assembly.dll' den Assembly.CodeBasederlenmiş bir dosya) geçirebilirsiniz ve derleme başarıyla yüklenir. .NET'te assemblyFile değeri, URI'leri düzgün şekilde işlemeyen Path.GetFullPath'ye geçirilir, bu nedenle yük başarısız olur. Zaten bir dosya URI dizeniz varsa, Uri örneğini oluşturun ve LocalPath özelliğini kullanarak dosya yolunu alın, ardından Assembly.LoadFrom çağrısını yapın. Zaten yüklenmiş bir derlemenin dosya yolunu almak için CodeBase yerine Assembly.Location kullanın.

Algoritma

Aşağıdaki algoritma, çalışma zamanının yönetilen derlemeyi nasıl yüklediği açıklanmaktadır.

  1. active AssemblyLoadContext öğesini belirleyin.

  2. Load-by-name yöntemler için, activeAssemblyLoadContext derlemeyi aşağıdaki öncelik sırasına göre yükler:

  3. Diğer yük türleri için, activeAssemblyLoadContext derlemeyi aşağıdaki öncelik sırasına göre yükler:

  4. Her iki durumda da, bir derleme yeni yüklenirse AppDomain.AssemblyLoad olayı tetiklenir.