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 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.
Instancja 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.

Ważna

W przeciwieństwie do .NET Framework, parametr assemblyFileAssembly.LoadFrom jest traktowany jako ścieżka pliku w .NET, a nie jako identyfikator URI. W programie .NET Framework można przekazać identyfikator URI pliku (na przykład file:///C:/path/to/assembly.dll) — taki jak skonstruowany z elementu Assembly.CodeBase — i pomyślnie załadować zestaw. Na platformie .NET wartość assemblyFile jest przekazywana do elementu Path.GetFullPath, który nie obsługuje poprawnie identyfikatorów URI, więc ładowanie kończy się niepowodzeniem. Jeśli masz już ciąg identyfikatora URI pliku, najpierw utwórz instancję Uri i użyj jej właściwości LocalPath, aby uzyskać ścieżkę pliku przed wywołaniem Assembly.LoadFrom. Aby uzyskać ścieżkę pliku już załadowanego zestawu, użyj polecenia Assembly.Location zamiast CodeBase.

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:

  4. W każdym przypadku, jeśli zestaw jest załadowany po raz pierwszy, wówczas zdarzenie AppDomain.AssemblyLoad jest zgłaszane.