Felügyelt szerelvénybetöltési algoritmus

A felügyelt szerelvények különböző fázisokkal rendelkező algoritmussal vannak elhelyezve és betöltve.

A műholdas szerelvények és WinRT szerelvények kivételével minden felügyelt szerelvények ugyanazt az algoritmust használják.

Mikor töltődnek be a felügyelt összeállítások?

A felügyelt szerelvénybetöltések aktiválásának leggyakoribb mechanizmusa egy statikus szerelvényhivatkozás. Ezeket a hivatkozásokat a fordító szúrja be, amikor a kód egy másik szerelvényben meghatározott típust használ. Ezeket a szerelvényeket szükség szerint betölti (load-by-name) a futtatókörnyezet. A statikus szerelvényhivatkozások betöltésének pontos időzítése nincs meghatározva. Futásidejű verziók között változhat, és az optimalizálás, például a beágyazás befolyásolja.

A következő API-k közvetlen használata terheléseket is aktivál:

API Leírás Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name Ez a példány.
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
Betöltés az elérési útból. Ez a példány.
AssemblyLoadContext.LoadFromStream Betöltés objektumból. Ez a példány.
Assembly.LoadFile Betöltés az elérési útból egy új AssemblyLoadContext példányban Az új AssemblyLoadContext példány.
Assembly.LoadFrom Betöltés a AssemblyLoadContext.Default példány elérési útvonalából.
Ad hozzá egy AppDomain.AssemblyResolve kezelőt. A kezelő betölti az assembly függőségeit a könyvtárából.
A AssemblyLoadContext.Default példány.
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name. A hívótól származó következtetés.
Részesítse előnyben a AssemblyLoadContext metódusokat.
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
Új AssemblyLoadContext példányban történő betöltés objektumból. Az új AssemblyLoadContext példány.
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name. A hívótól származó következtetés.
Előnyben részesítsen Type.GetType metódust, amely assemblyResolver argumentummal rendelkezik.
Assembly.GetType Ha a típus name egy szerelvény minősített általános típusát írja le, aktiváljon egy Load-by-name. A hívótól származó következtetés.
Előnyben részesítendő Type.GetType , ha szerelvény minősített típusneveket használ.
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name. A hívótól származó következtetés.
Előnyben részesítse Activator.CreateInstance az argumentumot használó metódusokat Type .

Fontos

A .NET-keretrendszertől eltérően a assemblyFile paraméter Assembly.LoadFrom a .NET fájlútvonalaként, nem URI-ként lesz kezelve. A .NET-keretrendszerben átadhat egy fájl URI-t (például file:///C:/path/to/assembly.dll), például egy Assembly.CodeBase-ből létrehozott fájl esetében, és az assembly sikeresen betöltődik. A .NET-ben az assemblyFile értéke átadódik a Path.GetFullPath részére, amely nem kezeli megfelelően az URI-kat, ezért a betöltés meghiúsul. Ha már rendelkezik egy fájl URI-sztringgel, először hozzon létre egy példányt Uri, majd annak tulajdonságának segítségével kérje le a fájl elérési útját, mielőtt meghívná LocalPath. Ha egy már betöltött szerelvény fájlútvonalát szeretné lekérni, használja a Assembly.Location ahelyett, hogy a CodeBase-t használná.

Algoritmus

Az alábbi algoritmus bemutatja, hogy a futtatás ideje alatt hogyan tölt be egy kezelt assembly-t.

  1. Határozza meg a activeAssemblyLoadContext.

  2. A Load-by-name metódusok esetében a activeAssemblyLoadContext az összetevőt a következő prioritási sorrendben tölti be:

  3. Más típusú terhelések esetén a activeAssemblyLoadContext szerelvény a következő prioritási sorrendben töltődik be:

  4. Bármelyik esetben, ha egy összeállítás újonnan van betöltve, akkor az AppDomain.AssemblyLoad esemény emelkedik.