Dela via


Algoritm för inläsning av hanterad sammansättning

Hanterade sammansättningar finns och läses in med en algoritm som har olika faser.

Alla hanterade sammansättningar utom satellitsammansättningar och WinRT sammansättningar använder samma algoritm.

När läses hanterade sammansättningar in?

Den vanligaste mekanismen för att utlösa en hanterad sammansättningsbelastning är en referens för statisk sammansättning. Dessa referenser infogas av kompilatorn när koden använder en typ som definierats i en annan sammansättning. Dessa sammansättningar läses in (load-by-name) efter behov av körningen. Den exakta tidpunkten för när de statiska sammansättningsreferenserna läses in är ospecificerad. Det kan variera mellan körningsversioner och påverkas av optimeringar som inlining.

Direkt användning av följande API:er utlöser också belastningar:

API beskrivning Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Den här instansen.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Läs in från sökvägen. Den här instansen.
AssemblyLoadContext.LoadFromStream Läs in från objektet. Den här instansen.
Assembly.LoadFile Läsa in från sökvägen i en ny AssemblyLoadContext instans Den nya AssemblyLoadContext instansen.
Assembly.LoadFrom Läs in från sökvägen i instansen AssemblyLoadContext.Default .
Lägger till en AppDomain.AssemblyResolve hanterare. Hanteraren läser in sammansättningens beroenden från dess katalog.
Instansen AssemblyLoadContext.Default .
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. Härledd från uppringaren.
Föredrar AssemblyLoadContext metoder.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Läs in från objekt i en ny AssemblyLoadContext instans. Den nya AssemblyLoadContext instansen.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. Härledd från uppringaren.
Föredrar Type.GetType metoder med ett assemblyResolver argument.
Assembly.GetType Om typen name beskriver en sammansättningskvalificerad allmän typ utlöser du en Load-by-name. Härledd från uppringaren.
Föredra Type.GetType när du använder sammansättningskvalificerade typnamn.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. Härledd från uppringaren.
Föredrar Activator.CreateInstance metoder som tar ett Type argument.

Algoritm

Följande algoritm beskriver hur körningen läser in en hanterad sammansättning.

  1. active AssemblyLoadContextFastställ .

  2. Load-by-name För metoderna active AssemblyLoadContext läser sammansättningen in i följande prioritetsordning:

  3. För de andra typerna av belastningar active AssemblyLoadContext läser sammansättningen in i följande prioritetsordning:

    • Kontrollera dess cache-by-name.
    • Läs in från den angivna sökvägen eller det råa sammansättningsobjektet. Om en sammansättning nyligen har lästs in läggs en referens till i instansens active AssemblyLoadContext cache-by-name.
  4. I båda fallen, om en sammansättning nyligen har lästs in, AppDomain.AssemblyLoad utlöses händelsen.