Udostępnij za pośrednictwem


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

Użycie w środowisku uruchomieniowym

Środowisko uruchomieniowe implementuje dwa konteksty ładowania zestawów:

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:

  1. 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 nullwartość , moduł ładujący spróbuje załadować zestaw do elementu AssemblyLoadContext.Default.
  2. 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 nullwartość , 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.