Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 bir AssemblyLoadContext örnek, Assembly başına tam olarak bir sürümü 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 dinamik kod yüklemesini desteklemek için, aynı uygulamada Assembly'in çakışan sürümlerinin yüklenmesine olanak sağlar. Her AssemblyLoadContext örneği, her AssemblyName.Name örneğini belirli bir Assembly örneğiyle 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
Çalışma başlatılırken AssemblyLoadContext.Default örneği, çalışma zamanı tarafından otomatik olarak doldurulur. Tüm statik bağımlılıkları 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 atmamaya çalışın. İstek yapılan bağımlılık bulunamadığında bu işlevlerin fırlatma yerine
nulldöndürmesi beklenir. Aramayı erken sonlandıracak ve çağırana bir istisna yayacak olan fırlatma. Hata fırlatmayı, bozuk derleme veya yetersiz bellek durumu gibi beklenmeyen hatalarla sınırlı tutmak gerekir. - Ö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 geri döndürmek
nullve yükün AssemblyLoadContext.Default tarafından işlenmesine izin vermek en basit seçenek olabilir. - İplik yarışlarına dikkat edin. Yükleme birden çok iş parçacığı tarafından tetiklenebilir. AssemblyLoadContext, parçacık yarışmalarını önbelleğine atomik şekilde derlemeler ekleyerek yönetir. Yarışı kaybedenin verisi silinir. 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, Assembly örnekleri ve Type tanımları için benzersiz bir kapsamı temsil eder.
Bu bağımlılıklar arasında ikili yalıtım yoktur. Sadece isimlerinden dolayı birbirlerini bulamayıp yalnız kalmışlardır.
Her AssemblyLoadContextbirinde:
- AssemblyName.Name farklı Assembly bir örneğe başvurabilir.
-
Type.GetType aynı tür için farklı bir tür
nameörneği döndürebilir.
Paylaşılan bağımlılıklar
Bağımlılıklar AssemblyLoadContext ve benzeri örnekler arasında kolayca paylaşılabilir. Genel model, bir bağımlılığı yüklemek için AssemblyLoadContext kullanmaktır. Diğeri, yüklenen derlemeye referans kullanarak bağımlılığı paylaşır.
Bu paylaşım, çalışma zamanında kullanılan derlemeler için gereklidir. Bu derlemeler yalnızca içine AssemblyLoadContext.Defaultyüklenebilir. Aynı şey , ASP.NETveya WPFgibi WinFormsç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ğinin kodlamasına dahil edilmiştir. AssemblyLoadContext geçersiz kılınabilecek çeşitli olaylara ve sanal işlevlere sahiptir. Bu işlevlerden herhangi biri başka bir Assembly örnekte yüklenen bir AssemblyLoadContext örneğe başvuru döndürdüğünde, Assembly örnek paylaşılır. Standart yük algoritması, yaygın paylaşım modelini basitleştirmek için yüklemeyi AssemblyLoadContext.Default'ye devreder. 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. Ancak ve ancak aynı Assembly örneğinden geliyorlarsa aynı türdedirler.
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ürlerin basit tür adlarıyla özel durum iletilerinde anıldığı belirtilir. 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:
- Her türün Type.Assembly’si.
- Her türün AssemblyLoadContext değeri, AssemblyLoadContext.GetLoadContext(Assembly) işlevi aracılığıyla elde edilebilir.
İki nesne a ve b gö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.
Ortak paylaşılan türleri kullanın. Bu paylaşılan tür, temel bir çalışma zamanı türü olabilir veya ortak bir derlemede yeni bir paylaşılan tür oluşturma sürecini 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.
Bir türden diğerine dönüştürmek için veri aktarım tekniklerini kullanın.