Sdílet prostřednictvím


Algoritmus načítání spravovaných sestavení

Spravovaná sestavení jsou lokalizována a načítána pomocí algoritmu s několika různými fázemi.

Všechna spravovaná sestavení s výjimkou satelitních sestavení a WinRT sestavení používají stejný algoritmus.

Kdy jsou spravovaná sestavení načtena?

Nejběžnějším mechanismem pro aktivaci zatížení spravovaného sestavení je statický odkaz na sestavení. Tyto odkazy kompilátor vloží pokaždé, když kód používá typ definovaný v jiném sestavení. Tato sestavení se načtou (load-by-name) podle potřeby běhového prostředí. Přesný čas načtení odkazů na statické sestavení není specifikován. Může se lišit mezi verzemi modulu runtime a je ovlivněn optimalizacemi, jako je vkládání.

Přímé použití následujících rozhraní API také aktivuje načtení:

API Popis Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Tato instance.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Načtení z cesty Tato instance.
AssemblyLoadContext.LoadFromStream Načtení z objektu Tato instance.
Assembly.LoadFile Načtení z cesty v nové AssemblyLoadContext instanci Nová AssemblyLoadContext instance.
Assembly.LoadFrom Načtěte ze cesty v instanci AssemblyLoadContext.Default.
Přidá obslužnou rutinu AppDomain.AssemblyResolve . Obslužná rutina načte závislosti sestavení z jeho adresáře.
Instance AssemblyLoadContext.Default.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Odvozeno od volajícího.
Upřednostňuji AssemblyLoadContext metody.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Načtení z objektu v nové AssemblyLoadContext instanci Nová AssemblyLoadContext instance.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Odvozeno od volajícího.
Upřednostňujte Type.GetType metody s argumentem assemblyResolver .
Assembly.GetType Pokud typ name popisuje obecný typ kvalifikovaný sestavením, vyvolejte Load-by-name. Odvozeno od volajícího.
Preferujte Type.GetType při používání názvů typů kvalifikovaných sestavení.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Odvozeno od volajícího.
Upřednostňte Activator.CreateInstance metody, které mají jako argument Type.

Důležité

Na rozdíl od rozhraní .NET Framework assemblyFile je parametr Assembly.LoadFrom považován za cestu k souboru v .NET, nikoli identifikátor URI. V rozhraní .NET Framework můžete předat identifikátor URI souboru (například file:///C:/path/to/assembly.dll), například zkonstruovaný z Assembly.CodeBase) a sestavení se úspěšně načte. V rozhraní .NET se hodnota assemblyFile předá do Path.GetFullPath, který nesprávně zpracovává URI, takže načítání selže. Pokud již máte řetězec identifikátoru URI souboru, nejprve vytvořte Uri instanci a pomocí jeho LocalPath vlastnosti získejte cestu k souboru před voláním Assembly.LoadFrom. Chcete-li získat cestu k souboru již načteného sestavení, použijte Assembly.Location místo CodeBase.

Algoritmus

Následující algoritmus popisuje, jak modul runtime načte spravované sestavení.

  1. Určete activeAssemblyLoadContext.

  2. Pro metody Load-by-name načte activeAssemblyLoadContext sestavení v následujícím pořadí priority:

  3. U ostatních typů zatížení načte sestavení activeAssemblyLoadContext v pořadí následujících priorit:

  4. V obou případech, pokud je sestavení nově načteno, je událost AppDomain.AssemblyLoad vyvolána.