Olvasás angol nyelven

Megosztás a következőn keresztül:


System.Runtime.Loader.AssemblyLoadContext osztály

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

Ez AssemblyLoadContext egy terhelési környezetet jelöl. A terhelési környezet elméletileg hatókört hoz létre a szerelvények betöltéséhez, feloldásához és esetleges kiürítéséhez.

Ez AssemblyLoadContext elsősorban a szerelvénybetöltés elkülönítésére szolgál. Lehetővé teszi ugyanazon szerelvény több verziójának betöltését egyetlen folyamaton belül. A .NET-keretrendszer több AppDomain példánya által biztosított elkülönítési mechanizmusokat váltja fel.

Megjegyzés

Használat a futtatókörnyezetben

A futtatókörnyezet két szerelvénybetöltési környezetet valósít meg:

  • AssemblyLoadContext.Default A futtatókörnyezet alapértelmezett környezetét jelöli, amelyet az alkalmazás főszerelvényéhez és statikus függőségeihez használnak.
  • A Assembly.LoadFile(String) módszer a legalapvetőbb AssemblyLoadContextpéldányosítással elkülöníti a betölthető szerelvényeket . Egy egyszerű elkülönítési sémával rendelkezik, amely minden szerelvényt saját AssemblyLoadContext maga tölt be függőségfeloldás nélkül.

Alkalmazáshasználat

Az alkalmazások létrehozhatnak saját AssemblyLoadContext megoldásokat a speciális helyzetekhez. A testreszabás a függőségfeloldási mechanizmusok meghatározására összpontosít.

A AssemblyLoadContext felügyelt szerelvényfeloldás implementálásához két bővítménypontot biztosít:

  1. Ez AssemblyLoadContext.Load(AssemblyName) a módszer biztosítja az első esélyt a AssemblyLoadContext szerelvény feloldására, betöltésére és visszaküldésére. Ha a AssemblyLoadContext.Load(AssemblyName) metódus visszatér null, a rakodó megpróbálja betölteni a szerelvényt a AssemblyLoadContext.Default.
  2. Ha a AssemblyLoadContext.Default szerelvény nem oldható fel, az eredeti AssemblyLoadContext kap egy második esélyt a szerelvény feloldására. A futtatókörnyezet aktiválja az eseményt Resolving .

Emellett a AssemblyLoadContext.LoadUnmanagedDll(String) virtuális módszer lehetővé teszi az alapértelmezett nem felügyelt szerelvényfeloldás testreszabását. Az alapértelmezett implementáció visszaadja nulla hibát, ami miatt a futtatókörnyezeti keresés az alapértelmezett keresési szabályzatot használja. Az alapértelmezett keresési szabályzat elegendő a legtöbb forgatókönyvhöz.

Technikai kihívások

  • Nem tölthető be a futtatókörnyezet több verziója egyetlen folyamatba.

    Figyelemfelhívás

    A több példány vagy a keretrendszer-szerelvények különböző verzióinak betöltése váratlan és nehezen diagnosztizálható viselkedéshez vezethet.

    Tipp.

    Az elkülönítési probléma megoldásához használjon folyamathatárokat újra- vagy folyamatközi kommunikációval.

  • Az szerelvénybetöltés időzítése megnehezítheti a tesztelést és a hibakeresést. A szerelvények általában a függőségeik azonnali feloldása nélkül töltődnek be. A függőségek szükség szerint töltődnek be:

    • Amikor a kód egy függő szerelvénybe ágaz.
    • Amikor a kód betölti az erőforrásokat.
    • Amikor a kód kifejezetten betölti a szerelvényeket.
  • A megvalósítás AssemblyLoadContext.Load(AssemblyName) új függőségeket adhat hozzá, amelyeket el kell különíteni, hogy különböző verziók létezhessenek. A legtermedelemesebb implementáció ezeket a függőségeket az alapértelmezett környezetben helyezi el. A gondos tervezés elkülönítheti az új függőségeket.

  • Ugyanazt a szerelvényt többször tölti be a rendszer különböző környezetekbe.

    • Ez zavaró hibaüzenetekhez vezethet, például a "Sample.Plugin" típusú objektum nem adhatja le a "Sample.Plugin" típust.
    • Az elkülönítési határok közötti marsallálás nem triviális. Egy tipikus megoldás egy olyan szerelvényben definiált felület használata, amely csak az alapértelmezett terhelési környezetbe van betöltve.