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 jest pod wpływem optymalizacji, takich jak wbudowywanie funkcji.

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

API (Interfejs Programowania Aplikacji) 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 ze ś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 typ ogólny zakwalifikowany do zestawu, wywołaj element Load-by-name. Wywnioskowany z obiektu wywołującego.
Preferować Type.GetType przy używaniu nazw typów kwalifikowanych przez zestaw.
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.
Preferowanie metod Activator.CreateInstance, które przyjmują argument Type.

Algorytm

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

  1. Ustal element activeAssemblyLoadContext.

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

  3. W przypadku innych typów obciążeń zestaw activeAssemblyLoadContext 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 activeAssemblyLoadContext wystąpienia cache-by-name.
  4. W każdym przypadku, jeśli zestaw jest załadowany po raz pierwszy, wówczas zdarzenie AppDomain.AssemblyLoad jest zgłaszane.