System.Runtime.Loader.AssemblyLoadContext – třída
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
Představuje AssemblyLoadContext kontext načtení. Kontext načtení vytvoří obor pro načítání, překlad a potenciální uvolnění sady sestavení.
Existuje AssemblyLoadContext především k zajištění izolace načítání sestavení. Umožňuje načtení více verzí stejného sestavení v rámci jednoho procesu. Nahrazuje mechanismy izolace poskytované více AppDomain instancemi v rozhraní .NET Framework.
Poznámka:
- AssemblyLoadContext neposkytuje žádné funkce zabezpečení. Veškerý kód má úplná oprávnění procesu.
- Pouze AssemblyLoadContext v .NET Core 2.0 – 2.2 je abstraktní třída. Chcete-li vytvořit konkrétní třídu v těchto verzích, implementujte metodu AssemblyLoadContext.Load(AssemblyName) .
Využití v modulu runtime
Modul runtime implementuje dva kontexty načtení sestavení:
- AssemblyLoadContext.Default představuje výchozí kontext modulu runtime, který se používá pro hlavní sestavení aplikace a jeho statické závislosti.
- Metoda Assembly.LoadFile(String) izoluje sestavení, která načítá, vytvořením instance nejzásadnější AssemblyLoadContext. Má zjednodušené schéma izolace, které načte každé sestavení ve svém vlastním AssemblyLoadContext , bez rozlišení závislostí.
Využití aplikace
Aplikace může vytvořit vlastní AssemblyLoadContext řešení pro pokročilé scénáře. Přizpůsobení se zaměřuje na definování mechanismů řešení závislostí.
Poskytuje AssemblyLoadContext dva body rozšíření pro implementaci řešení spravovaného sestavení:
- Metoda AssemblyLoadContext.Load(AssemblyName) poskytuje první šanci AssemblyLoadContext na vyřešení, načtení a vrácení sestavení. Pokud metoda AssemblyLoadContext.Load(AssemblyName) vrátí
null
, zavaděč se pokusí načíst sestavení do AssemblyLoadContext.Default. - AssemblyLoadContext.Default Pokud se sestavení nepodaří přeložit, původní AssemblyLoadContext sestavení získá druhou šanci na vyřešení sestavení. Modul runtime vyvolá Resolving událost.
Virtuální metoda navíc AssemblyLoadContext.LoadUnmanagedDll(String) umožňuje přizpůsobení výchozího nespravovaného překladu sestavení. Výchozí implementace vrátí null
, což způsobí, že hledání za běhu použije výchozí zásady vyhledávání. Výchozí zásada vyhledávání je dostatečná pro většinu scénářů.
Technické výzvy
V jednom procesu není možné načíst více verzí modulu runtime.
Upozornění
Načtení více kopií nebo různých verzí sestavení architektury může vést k neočekávanému a obtížnému chování.
Tip
K vyřešení tohoto problému izolace použijte hranice procesů se vzdálené komunikace nebo komunikace mezi procesy.
Načasování načítání sestavení může ztížit testování a ladění. Sestavení se obvykle načítají bez okamžitého vyřešení jejich závislostí. Závislosti se načtou podle potřeby:
- Když kód rozdělí do závislého sestavení.
- Když kód načte prostředky.
- Když kód explicitně načte sestavení.
Implementace AssemblyLoadContext.Load(AssemblyName) může přidat nové závislosti, které mohou být potřeba izolovat, aby mohly existovat různé verze. Nejpřirozenější implementace by tyto závislosti umístila do výchozího kontextu. Opatrný návrh může izolovat nové závislosti.
Stejné sestavení se načte vícekrát do různých kontextů.
- To může způsobit matoucí chybové zprávy, například "Nelze přetypovat objekt typu Sample.Plugin na typ Sample.Plugin".
- Zařazování přes hranice izolace není triviální. Typickým řešením je použít rozhraní definované v sestavení, které je načteno pouze do výchozího kontextu načítání.