Domény a sestavení aplikací

Toto téma popisuje relace mezi aplikačními doménami a sestaveními. Před spuštěním kódu, který aplikační doména obsahuje je nutné do ní načíst sestavení. Běh typické aplikace způsobuje několik sestavení, které mají být načteny do aplikační domény.

Způsob, jakým je sestavení načteno, určuje zda jeho kód zkompilovaný za běhu může být sdílen více aplikačními doménami v procesu a zda sestavení může být z procesu uvolněno.

  • Pokud je sestavení načteno jako doménově neutrální, všechny aplikační domény, které sdílejí stejnou udělenou sadu zabezpečení, mohou sdílet stejný kód, který je zkompilován za běhu, což snižuje velikost paměti, jakou požaduje aplikace. Nicméně sestavení nemohou nikdy být uvolněna z procesu.

  • Pokud sestavení není načteno jako doménově neutrální, musí být kompilováno za běhu v každé aplikační doméně, ve které je načteno. Sestavení však může být uvolněno z procesu uvolněním všech aplikačních domén, ve kterých je načteno.

Hostitelské prostředí modulu runtime určuje zda se má sestavení načíst jako doménově neutrální, když ho modul runtime načítá do procesu. Pro spravované aplikace použijte atribut LoaderOptimizationAttribute pro vstupní bod metody procesu a zadejte hodnotu z asociovaného výčtu LoaderOptimization. Pro nespravované aplikace, které jsou hostitelem modulu CLR (Common Language Runtime) zadejte odpovídající příznak při volání metody CorBindToRuntimeEx – funkce.

Existují tři možnosti pro načítání doménově neutrálních sestavení:

  • SingleDomain nenačítá žádné sestavení jako doménově neutrální, s výjimkou Mscorlib, které je vždy načteno jako doménově neutrální. Toto nastavení se nazývá jediná doména, protože se běžně používá v případě, kdy hostitel spouští pouze jednu aplikaci v procesu.

  • MultiDomain načte všechna sestavení jako doménově neutrální. Použijte toto nastavení pokud existuje více aplikačních domén v procesu, přičemž všechny spouští stejný kód.

  • MultiDomainHost načte silně pojmenovaná sestavení jako doménově neutrální, pokud ony a všechny jejich závislosti byly nainstalovány v globální mezipaměti sestavení (GAC). Jiná sestavení jsou načtena a zkompilována za běhu samostatně pro každou aplikační doménu, ve které jsou načteny a proto mohou být uvolněny z procesu. Použijte toto nastavení v případě, že ve stejném procesu běží více než jedna aplikace nebo pokud máte směs sestavení, která jsou sdílena mnoha aplikačními doménami a sestavení, která musí být uvolněna z procesu.

Kód zkompilovaný JIT kompilátorem nemůže být sdílen sestaveními, které byly nahrány s využitím kontextu pomocí metody LoadFrom třídy Assembly nebo sestavení načtená z obrazů pomocí přetížení metody Load, která specifikuje pole bytů.

Sestavení, která byla zkompilována do nativního kódu pomocí Ngen.exe (generátor nativních obrázků) mohou být sdílena mezi aplikačními doménami pokud jsou při prvním načtení do procesu načteny jako doménově neutrální.

Kód pro sestavení, který je zkompilovaný JIT kompilátorem a obsahuje vstupní bod aplikace je sdílen pouze v případě, že všechny jeho závislosti mohou být sdíleny.

Doménově neutrální sestavení může být zkompilováno za běhu více než jednou. Například, když se udělené sady zabezpečení dvou aplikačních domén liší, nemohou sdílet stejný kód zkompilováný za běhu. Nicméně každá kopie za běhu zkompilovaného sestavemí může být sdílena s jinými aplikačními domenámi, které mají udělenou stejnou sadu.

Při rozhodování zda načíst sestavení jako doménově neutrální, je nutné udělat kompromis mezi snížením využití paměti a jinými výkonostními faktory.

  • Přístup k statickým datům a metodám je pro doménově neutrální sestavení pomalejší z důvodu nutnosti izolovat sestavení. Je nutné, aby každá aplikační doména, která přistupuje k sestavení, měla samostatnou kopii statických dat, aby se zabránilo odkazům na objekty ve statických položkách překračování hranic domén. V důsledku toho modul runtime obsahuje další logiku k nasměrování volajícího k odpovídající kopii statických dat nebo metody. Tato dodatečná logika zpomaluje volání.

  • Je nutné, aby všechny závislosti sestavení byly umístěny a načteny, když je sestavení načteno jako doménově neutrální, protože závislost, která nemůže být načtena jako doménově neutrální, brání sestavení v doménově neutrálním načtení.

Viz také

Další zdroje

Aplikační domény

Sestavení v modulu CLR (Common Language Runtime)