Udostępnij za pośrednictwem


Algorytm ładowania zarządzanego zestawu

Zarządzane zestawy znajdują się i są ładowane za pomocą algorytmu, który ma różne etapy.

Wszystkie zarządzane zestawy z wyjątkiem zestawów satelickich i WinRT zestawów używają tego samego algorytmu.

Kiedy są ładowane zarządzane zestawy?

Najczęstszym mechanizmem wyzwalania obciążenia zarządzanego zestawu jest statyczne odwołanie do zestawu. Te odwołania są wstawiane przez kompilator za każdym razem, gdy kod używa typu zdefiniowanego w innym zestawie. Te zestawy są ładowane () zgodnieload-by-name z potrzebami środowiska uruchomieniowego. Dokładny czas ładowania odwołań do zestawu statycznego jest nieokreślony. Może się różnić między wersjami środowiska uruchomieniowego i ma to wpływ na optymalizacje, takie jak tworzenie podkreślenia.

Bezpośrednie użycie następujących interfejsów API spowoduje również wyzwolenie obciążeń:

Interfejs API opis Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name To wystąpienie.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Załaduj ze ścieżki. To wystąpienie.
AssemblyLoadContext.LoadFromStream Załaduj z obiektu. To wystąpienie.
Assembly.LoadFile Ładowanie ze ścieżki w nowym AssemblyLoadContext wystąpieniu Nowe AssemblyLoadContext wystąpienie.
Assembly.LoadFrom Załaduj z ścieżki w wystąpieniu AssemblyLoadContext.Default .
Dodaje procedurę AppDomain.AssemblyResolve obsługi. Program obsługi załaduje zależności zestawu z katalogu.
Wystąpienie elementu AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Wywnioskowany z obiektu wywołującego.
Preferuj AssemblyLoadContext metody.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Załaduj z obiektu w nowym AssemblyLoadContext wystąpieniu. Nowe AssemblyLoadContext wystąpienie.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Wywnioskowany z obiektu wywołującego.
Preferuj Type.GetType metody z argumentem assemblyResolver .
Assembly.GetType Jeśli typ name opisuje kwalifikowany typ ogólny zestawu, wyzwól element Load-by-name. Wywnioskowany z obiektu wywołującego.
Preferuj Type.GetType używanie kwalifikowanych nazw typów zestawu.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Wywnioskowany z obiektu wywołującego.
Preferuj Activator.CreateInstance metody przy użyciu argumentu Type .

Algorytm

Poniższy algorytm opisuje sposób ładowania zestawu zarządzanego przez środowisko uruchomieniowe.

  1. Ustal element active AssemblyLoadContext.

  2. Load-by-name W przypadku metod zestaw active AssemblyLoadContext jest ładowany w następującej kolejności priorytetu:

  3. W przypadku innych typów obciążeń zestaw active AssemblyLoadContext jest ładowany w następującej kolejności priorytetu:

    • Sprawdź jego .cache-by-name
    • Załaduj z określonej ścieżki lub nieprzetworzonego obiektu zestawu. Jeśli zestaw jest nowo załadowany, odwołanie zostanie dodane do active AssemblyLoadContext wystąpienia cache-by-name.
  4. W obu przypadkach, jeśli zestaw jest nowo załadowany, AppDomain.AssemblyLoad zdarzenie jest zgłaszane.