System.Runtime.Loader.AssemblyLoadContext Hakkında

sınıfı AssemblyLoadContext .NET Core'da kullanıma sunulmuştur ve .NET Framework'te kullanılamaz. Bu makalede AssemblyLoadContext API belgeleri kavramsal bilgilerle tamamlanmıştır.

Bu makale, özellikle dinamik yükleme çerçevesi geliştiricileri olmak üzere dinamik yükleme uygulayan geliştiricilerle ilgilidir.

AssemblyLoadContext nedir?

Her .NET 5+ ve .NET Core uygulaması örtük olarak kullanır AssemblyLoadContext. Bağımlılıkları bulmak ve yüklemek için çalışma zamanının sağlayıcısıdır. Bir bağımlılık yüklendiğinde, bu bağımlılığı bulmak için bir AssemblyLoadContext örnek çağrılır.

  • AssemblyLoadContext yönetilen derlemeleri ve diğer bağımlılıkları bulma, yükleme ve önbelleğe alma hizmeti sağlar.
  • Dinamik kodun yüklenmesini ve kaldırılmasını desteklemek için, kodu ve bağımlılıklarını kendi AssemblyLoadContext örneğine yüklemek için yalıtılmış bir bağlam oluşturur.

Sürüm oluşturma kuralları

Tek AssemblyLoadContext bir örnek, basit derleme adı başına tam olarak bir Assembly sürümünü yüklemekle sınırlıdır. Zaten bu adın bir derlemesine sahip olan bir AssemblyLoadContext örneğe yönelik bir derleme başvurusu çözümlendiğinde, istenen sürüm yüklenen sürümle karşılaştırılır. Çözüm, yalnızca yüklenen sürüm istenen sürüme eşit veya daha yüksekse başarılı olur.

Birden çok AssemblyLoadContext örneğine ne zaman ihtiyacınız var?

Tek AssemblyLoadContext bir örneğin derlemenin yalnızca bir sürümünü yükleyebileceği kısıtlaması, kod modülleri dinamik olarak yüklenirken sorun haline gelebilir. Her modül bağımsız olarak derlenmiştir ve modüller farklı sürümlerine Assemblybağlı olabilir. Bu genellikle farklı modüllerin yaygın olarak kullanılan bir kitaplığın farklı sürümlerine bağımlı olması sorunudur.

Api, AssemblyLoadContext kodu dinamik olarak yüklemeyi desteklemek için aynı uygulamada çakışan sürümlerinin Assembly yüklenmesini sağlar. Her AssemblyLoadContext örnek, her AssemblyName.Name bir örneği belirli Assembly bir örneğe eşleyen benzersiz bir sözlük sağlar.

Ayrıca, daha sonra kaldırılan bir kod modülüyle ilgili bağımlılıkları gruplandırmak için kullanışlı bir mekanizma sağlar.

AssemblyLoadContext.Default örneği

Örnek AssemblyLoadContext.Default , başlangıçta çalışma zamanı tarafından otomatik olarak doldurulur. Tüm statik bağımlılıkları bulmak ve bulmak için varsayılan yoklama kullanır.

En yaygın bağımlılık yükleme senaryolarını çözer.

Dinamik bağımlılıklar

AssemblyLoadContext geçersiz kılınabilecek çeşitli olaylara ve sanal işlevlere sahiptir.

Örnek AssemblyLoadContext.Default yalnızca olayları geçersiz kılmayı destekler.

Yönetilen derleme yükleme algoritması, Uydu derleme yükleme algoritması ve Yönetilmeyen (yerel) kitaplık yükleme algoritması makaleleri tüm kullanılabilir olaylara ve sanal işlevlere başvurur. Makalelerde her olay ve işlevin yükleme algoritmalarındaki göreli konumu gösterilir. Bu makale bu bilgileri yeniden oluşturmaz.

Bu bölüm, ilgili olaylar ve işlevler için genel ilkeleri kapsar.

  • Tekrarlanabilir olun. Belirli bir bağımlılık sorgusu her zaman aynı yanıtla sonuçlanmalıdır. Aynı yüklü bağımlılık örneği döndürülmelidir. Bu gereksinim, önbellek tutarlılığı için temeldir. Özellikle yönetilen derlemeler için bir Assembly önbellek oluşturuyoruz. Önbellek anahtarı basit bir derleme adıdır. AssemblyName.Name
  • Genellikle atmayın. İstenen bağımlılığı bulamadığınızda bu işlevlerin oluşturma yerine döndürülmesi null beklenir. Oluşturma, aramayı erken sonlandıracak ve çağırana bir özel durum yayacaktır. Oluşturma işlemi bozuk derleme veya yetersiz bellek koşulu gibi beklenmeyen hatalara karşı kısıtlanmalıdır.
  • Özyinelemeden kaçının. Bu işlevlerin ve işleyicilerin bağımlılıkları bulmak için yükleme kurallarını uyguladığını unutmayın. Uygulamanız özyineleme tetikleyen API'leri çağırmamalıdır. Kodunuz genellikle belirli bir yol veya bellek başvurusu bağımsız değişkeni gerektiren AssemblyLoadContext yük işlevlerini çağırmalıdır.
  • Doğru AssemblyLoadContext içine yükleyin. Bağımlılıkların yüklendiği yer seçimi uygulamaya özgüdür. Seçim, bu olaylar ve işlevler tarafından uygulanır. Kodunuz AssemblyLoadContext yolu ile yükle işlevlerini çağırdığında, kodun yüklenmesini istediğiniz örnekte bu işlevleri çağırın. Bazen döndürmek null ve yükü işlemeye AssemblyLoadContext.Default izin vermek en basit seçenek olabilir.
  • İplik yarışlarına dikkat edin. Yükleme birden çok iş parçacığı tarafından tetiklenebilir. AssemblyLoadContext, önbelleğine atomik olarak derlemeler ekleyerek iş parçacığı yarışlarını işler. Yarış kaybedeninin örneği atılır. Uygulama mantığınızda, birden çok iş parçacığını düzgün işlemeyen ek mantık eklemeyin.

Dinamik bağımlılıklar nasıl yalıtılır?

Her AssemblyLoadContext örnek, örnekler ve Type tanımlar için Assembly benzersiz bir kapsamı temsil eder.

Bu bağımlılıklar arasında ikili yalıtım yoktur. Yalnızca adlarına göre birbirlerini bulamayarak yalıtılmışlardır.

Her AssemblyLoadContextbirinde:

Paylaşılan bağımlılıklar

Bağımlılıklar örnekler arasında AssemblyLoadContext kolayca paylaşılabilir. Genel model, bir bağımlılığın yüklenmesine AssemblyLoadContext yöneliktir. Diğeri, yüklenen derlemeye bir başvuru kullanarak bağımlılığı paylaşır.

Bu paylaşım çalışma zamanı derlemeleri için gereklidir. Bu derlemeler yalnızca içine AssemblyLoadContext.Defaultyüklenebilir. Aynı şey , WPFveya WinFormsgibi ASP.NETçerçeveler için de gereklidir.

Paylaşılan bağımlılıkların içine AssemblyLoadContext.Defaultyüklenmesi önerilir. Bu paylaşım, ortak tasarım desenidir.

Paylaşım, özel AssemblyLoadContext örneğin kodlamasında uygulanır. AssemblyLoadContext geçersiz kılınabilecek çeşitli olaylara ve sanal işlevlere sahiptir. Bu işlevlerden herhangi biri başka AssemblyLoadContext bir örneğe yüklenmiş bir Assembly örneğe başvuru döndürdüğünüzde, Assembly örnek paylaşılır. Standart yük algoritması, ortak paylaşım desenini AssemblyLoadContext.Default basitleştirmek için yüklemeye başvurur. Daha fazla bilgi için bkz . Yönetilen derleme yükleme algoritması.

Tür dönüştürme sorunları

İki AssemblyLoadContext örnek aynı nametüre sahip tür tanımları içerdiğinde, bunlar aynı türde değildir. Yalnızca aynı örnekten geliyorsa ve geliyorsa aynı Assembly türdedir.

Konuları karmaşıklaştırmak için, bu eşleşmeyen türler hakkındaki özel durum iletileri kafa karıştırıcı olabilir. Türler, özel durum iletilerinde basit tür adlarına göre başvurulur. Bu durumda genel özel durum iletisi şu biçimdedir:

'IsolatedType' türüne sahip nesne 'IsolatedType' türüne dönüştürülemez.

Tür dönüştürme sorunlarını ayıklama

Eşleşmeyen bir çift tür göz önüne alındığında, şunları da bilmek önemlidir:

ve iki nesnesi abgöz önüne alındığında, hata ayıklayıcıda aşağıdakilerin değerlendirilmesi yararlı olacaktır:

// In debugger look at each assembly's instance, Location, and FullName
a.GetType().Assembly
b.GetType().Assembly
// In debugger look at each AssemblyLoadContext's instance and name
System.Runtime.Loader.AssemblyLoadContext.GetLoadContext(a.GetType().Assembly)
System.Runtime.Loader.AssemblyLoadContext.GetLoadContext(b.GetType().Assembly)

Tür dönüştürme sorunlarını çözme

Bu tür dönüştürme sorunlarını çözmek için iki tasarım deseni vardır.

  1. Ortak paylaşılan türleri kullanın. Bu paylaşılan tür ilkel bir çalışma zamanı türü olabilir veya paylaşılan bir derlemede yeni bir paylaşılan tür oluşturmayı içerebilir. Paylaşılan tür genellikle bir uygulama derlemesinde tanımlanan bir arabirimdir . Daha fazla bilgi için bağımlılıkların nasıl paylaşıldığından bahsedin.

  2. Bir türden diğerine dönüştürmek için marshalling tekniklerini kullanın.