System.Runtime.Loader.AssemblyLoadContext, klasa
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Obiekt AssemblyLoadContext reprezentuje kontekst ładowania. Koncepcyjnie kontekst ładowania tworzy zakres ładowania, rozpoznawania i potencjalnie zwalniania zestawu zestawów.
Istnieje AssemblyLoadContext przede wszystkim, aby zapewnić izolację ładowania zestawu. Umożliwia ładowanie wielu wersji tego samego zestawu w ramach jednego procesu. Zastępuje on mechanizmy izolacji udostępniane przez wiele AppDomain wystąpień w programie .NET Framework.
Uwaga
- AssemblyLoadContext nie udostępnia żadnych funkcji zabezpieczeń. Cały kod ma pełne uprawnienia do procesu.
- Tylko w programie .NET Core 2.0 – 2.2 AssemblyLoadContext jest klasą abstrakcyjną. Aby utworzyć konkretną klasę w tych wersjach, zaimplementuj metodę AssemblyLoadContext.Load(AssemblyName) .
Użycie w środowisku uruchomieniowym
Środowisko uruchomieniowe implementuje dwa konteksty ładowania zestawów:
- AssemblyLoadContext.Default reprezentuje domyślny kontekst środowiska uruchomieniowego, który jest używany dla głównego zestawu aplikacji i jego statycznych zależności.
- Metoda Assembly.LoadFile(String) izoluje zestawy, które ładuje, tworząc wystąpienie najbardziej podstawowego AssemblyLoadContextelementu . Ma uproszczony schemat izolacji, który ładuje każdy zestaw samodzielnie AssemblyLoadContext bez rozwiązywania zależności.
Użycie aplikacji
Aplikacja może utworzyć własne AssemblyLoadContext , aby utworzyć niestandardowe rozwiązanie dla zaawansowanych scenariuszy. Dostosowanie koncentruje się na definiowaniu mechanizmów rozwiązywania zależności.
Element AssemblyLoadContext udostępnia dwa punkty rozszerzenia do implementowania zarządzanego rozpoznawania zestawów:
- Metoda AssemblyLoadContext.Load(AssemblyName) zapewnia pierwszą szansę na AssemblyLoadContext rozwiązanie, załadowanie i zwrócenie zestawu. AssemblyLoadContext.Load(AssemblyName) Jeśli metoda zwróci
null
wartość , moduł ładujący spróbuje załadować zestaw do elementu AssemblyLoadContext.Default. - Jeśli nie AssemblyLoadContext.Default można rozpoznać zestawu, oryginalny AssemblyLoadContext otrzyma drugą szansę na rozwiązanie zestawu. Środowisko uruchomieniowe Resolving zgłasza zdarzenie.
Ponadto metoda wirtualna AssemblyLoadContext.LoadUnmanagedDll(String) umożliwia dostosowanie domyślnej niezarządzanej rozdzielczości zestawu. Domyślna implementacja zwraca null
wartość , co powoduje, że wyszukiwanie w czasie wykonywania używa domyślnych zasad wyszukiwania. Domyślne zasady wyszukiwania są wystarczające dla większości scenariuszy.
Wyzwania techniczne
Nie można załadować wielu wersji środowiska uruchomieniowego w jednym procesie.
Uwaga
Ładowanie wielu kopii lub różnych wersji zestawów platformy może prowadzić do nieoczekiwanego i trudnego do zdiagnozowania zachowania.
Napiwek
Użyj granic procesów z komunikacją zdalną lub międzyprocesorowymi, aby rozwiązać ten problem z izolacją.
Czas ładowania zestawu może utrudnić testowanie i debugowanie. Zestawy są zwykle ładowane bez natychmiastowego rozwiązywania ich zależności. Zależności są ładowane zgodnie z potrzebami:
- Gdy kod jest odgałęzieny do zestawu zależnego.
- Gdy kod ładuje zasoby.
- Gdy kod jawnie ładuje zestawy.
Implementacja AssemblyLoadContext.Load(AssemblyName) programu może dodawać nowe zależności, które mogą wymagać odizolowania, aby umożliwić istnienie różnych wersji. Najbardziej naturalna implementacja spowoduje umieszczenie tych zależności w kontekście domyślnym. Staranne projektowanie może odizolować nowe zależności.
Ten sam zestaw jest ładowany wiele razy do różnych kontekstów.
- Może to prowadzić do mylących komunikatów o błędach, na przykład "Nie można rzutować obiektu typu Sample.Plugin", aby wpisać "Sample.Plugin".
- Przeprowadzanie marshalingu przez granice izolacji nie jest trywialne. Typowym rozwiązaniem jest użycie interfejsu zdefiniowanego w zestawie, który jest ładowany tylko do domyślnego kontekstu ładowania.