Sdílet prostřednictvím


Jak modul runtime vyhledá sestavení

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Chcete-li úspěšně nasadit aplikaci rozhraní .NET Framework, musíte pochopit, jak modul CLR (Common Language Runtime) vyhledá a vytvoří vazbu na sestavení, která tvoří vaši aplikaci. Modul runtime se ve výchozím nastavení pokusí svázat s přesnou verzí sestavení, se kterým byla aplikace vytvořena. Toto výchozí chování lze přepsat nastavením konfiguračního souboru.

Modul CLR (Common Language Runtime) provede řadu kroků při pokusu o vyhledání sestavení a vyřešení odkazu na sestavení. Každý krok je vysvětlený v následujících částech. Termín sondování se často používá při popisu způsobu, jakým modul runtime vyhledá sestavení; odkazuje na sadu heuristik použitých k vyhledání sestavení na základě jejího názvu a jazykové verze.

Poznámka:

Informace o vazbách můžete zobrazit v souboru protokolu pomocí Prohlížeče protokolů vazby sestavení (Fuslogvw.exe), který je součástí sady Windows SDK.

Zahájení vazby

Proces vyhledání a vazby na sestavení začíná, pokud se modul runtime pokusí resolvovat odkaz na jiné sestavení. Tento odkaz může být statický nebo dynamický. Kompilátor zaznamenává statické odkazy v metadatech manifestu sestavení v době sestavení. Dynamické odkazy se vytvářejí průběžně v důsledku volání různých metod, například Assembly.Load.

Upřednostňovaným způsobem, jak odkazovat na sestavení, je použít úplný odkaz, včetně názvu sestavení, verze, jazykové verze a tokenu veřejného klíče (pokud existuje). Modul runtime tyto informace používá k vyhledání sestavení podle kroků popsaných dále v této části. Modul runtime používá stejný proces řešení bez ohledu na to, zda je odkaz pro statické nebo dynamické sestavení.

Můžete také vytvořit dynamický odkaz na sestavení poskytnutím volající metody pouze s částečnými informacemi o sestavení, například zadat pouze název sestavení. V tomto případě se sestavení vyhledá pouze v adresáři aplikace a nedojde k žádné jiné kontrole. Částečnou referenci vytvoříte pomocí některé z různých metod načítání sestavení, jako je Assembly.Load nebo AppDomain.Load.

Nakonec můžete vytvořit dynamický odkaz pomocí metody, jako je Assembly.Load a poskytnout pouze částečné informace. Poté upřesníte odkaz pomocí prvku <qualifyAssembly> v konfiguračním souboru aplikace. Tento prvek umožňuje zadat úplné referenční informace (název, verzi, jazykovou verzi a token veřejného klíče) v konfiguračním souboru aplikace místo v kódu. Tuto techniku byste použili, pokud byste chtěli plně kvalifikovat odkaz na sestavení mimo adresář aplikace, nebo pokud chcete odkazovat na sestavení v globální mezipaměti sestavení, ale chtěli jste pohodlí zadat úplný odkaz v konfiguračním souboru místo v kódu.

Poznámka:

Tento typ částečného odkazu by se neměl používat se sestaveními, která jsou sdílena mezi několika aplikacemi. Vzhledem k tomu, že nastavení konfigurace se použije pro aplikaci a ne pro sestavení, bude sdílené sestavení používající tento typ částečného odkazu vyžadovat, aby každá aplikace, která používá sdílené sestavení, měla v konfiguračním souboru kvalifikující informace.

Modul runtime pro vyřešení odkazu na sestavení používá následující kroky:

  1. Určuje správnou verzi sestavení prozkoumáním příslušných konfiguračních souborů, včetně konfiguračního souboru aplikace, souboru zásad vydavatele a konfiguračního souboru počítače. Pokud se konfigurační soubor nachází na vzdáleném počítači, modul runtime musí nejprve vyhledat a stáhnout konfigurační soubor aplikace.

  2. Kontroluje, zda byl název sestavení již dříve svázán a pokud ano, používá již načtené sestavení. Pokud předchozí požadavek na načtení sestavení selhal, je požadavek okamžitě zamítnut, aniž by se znovu pokoušelo načíst sestavení.

    Poznámka:

    Ukládání chyb vazby sestavení do mezipaměti je v rozhraní .NET Framework verze 2.0 nové.

  3. Kontroluje globální mezipaměť sestavení. Pokud je v něm sestavení nalezeno, modul runtime použije toto sestavení.

  4. Sondy pro montáž pomocí následujících kroků:

    1. Pokud zásady konfigurace a vydavatele nemají vliv na původní odkaz a pokud byl požadavek vazby vytvořen pomocí metody Assembly.LoadFrom, runtime vyhledá indikace umístění.

    2. Pokud je v konfiguračních souborech nalezen základ kódu, modul runtime zkontroluje pouze toto umístění. Pokud tato sonda selže, modul runtime zjistí, že požadavek na vazbu selhal a nedojde k žádnému jinému sondování.

    3. Sondování pro sestavení pomocí heuristik popsaných v části věnované sondování. Pokud se sestavení po sondování nenajde, modul runtime požádá Instalační službu systému Windows o poskytnutí sestavení. Funguje jako funkce instalace na vyžádání.

      Poznámka:

      Neexistuje žádná kontrola verzí u sestavení bez silných jmen, ani kontrola během běhu v globální mezipaměti sestavení pro sestavení bez silných jmen.

Krok 1: Zkoumání konfiguračních souborů

Chování vazby sestavení lze nakonfigurovat na různých úrovních na základě tří souborů XML:

  • Konfigurační soubor aplikace.

  • Soubor zásad vydavatele.

  • Konfigurační soubor počítače.

Tyto soubory se řídí stejnou syntaxí a poskytují informace, jako jsou přesměrování vazby, umístění kódu a režimy vazeb pro konkrétní sestavení. Každý konfigurační soubor může obsahovat <assemblyBinding> prvek , který přesměruje proces vazby. Podřízené prvky elementu <assemblyBinding> zahrnují element <dependentAssembly>. Podřízené prvky <dependentAssembly> elementu zahrnují <assemblyIdentity> element, <bindingRedirect> element a <codeBase> element.

Poznámka:

Informace o konfiguraci najdete ve třech konfiguračních souborech; všechny prvky nejsou platné ve všech konfiguračních souborech. Například režim vazby a informace o privátní cestě mohou být pouze v konfiguračním souboru aplikace. Úplný seznam informací obsažených v jednotlivých souborech najdete v tématu Konfigurace aplikací pomocí konfiguračních souborů.

Konfigurační soubor aplikace

Nejprve modul CLR (Common Language Runtime) zkontroluje v konfiguračním souboru aplikace informace, které přepisují informace o verzi uložené v manifestu volajícího sestavení. Konfigurační soubor aplikace lze nasadit s aplikací, ale nevyžaduje se pro spuštění aplikace. Načítání tohoto souboru je obvykle téměř okamžité, ale v situacích, kdy je základ aplikace na vzdáleném počítači, například ve webovém scénáři, musí být konfigurační soubor stažen.

Pro spustitelné soubory klienta se konfigurační soubor aplikace nachází ve stejném adresáři jako spustitelný soubor aplikace a má stejný základní název jako spustitelný soubor s příponou .config. Například konfigurační soubor pro C:\Program Files\Myapp\Myapp.exe je C:\Program Files\Myapp\Myapp.exe.config. Ve scénáři založeném na prohlížeči musí soubor HTML použít <link> element k explicitní odkazování na konfigurační soubor.

Následující kód poskytuje jednoduchý příklad konfiguračního souboru aplikace. Tento příklad přidává TextWriterTraceListener do kolekce Listeners, aby umožnil zaznamenávání informací o ladění do souboru.

<configuration>
   <system.diagnostics>
      <trace useGlobalLock="false" autoflush="true" indentsize="0">
         <listeners>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
         </listeners>
      </trace>
   </system.diagnostics>
</configuration>

Soubor zásad vydavatele

Za druhé modul runtime zkontroluje soubor zásad vydavatele, pokud existuje. Soubory zásad vydavatele distribuují vydavatel komponenty jako opravu nebo aktualizaci sdílené komponenty. Tyto soubory obsahují informace o kompatibilitě vydané vydavatelem sdílené komponenty, která směruje odkaz na sestavení na novou verzi. Na rozdíl od konfiguračních souborů aplikací a systémů jsou soubory zásad vydavatele obsaženy ve vlastním sestavení, které je třeba nainstalovat do globální mezipaměti sestavení.

Následuje příklad konfiguračního souboru zásad vydavatele:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

            <dependentAssembly>
                <assemblyIdentity name="asm6" publicKeyToken="c0305c36380ba429" />
                <bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0"/>
            </dependentAssembly>

        </assemblyBinding>
    </runtime>
</configuration>

K vytvoření sestavení můžete použít nástroj Al.exe (Assembly Linker) s příkazem, jako je například následující:

Al.exe /link:asm6.exe.config /out:policy.3.0.asm6.dll /keyfile: compatkey.dat /v:3.0.0.0

compatkey.dat je soubor klíče silného názvu. Tento příkaz vytvoří sestavení se silným názvem, které můžete umístit do globální mezipaměti sestavení.

Poznámka:

Zásady vydavatele ovlivňují všechny aplikace, které používají sdílenou komponentu.

Konfigurační soubor zásad vydavatele přepíše informace o verzi, které pocházejí z aplikace (to znamená z manifestu sestavení nebo konfiguračního souboru aplikace). Pokud v konfiguračním souboru aplikace neexistuje žádný příkaz pro přesměrování verze zadané v manifestu sestavení, soubor zásad vydavatele přepíše verzi zadanou v manifestu sestavení. Pokud však v konfiguračním souboru aplikace existuje příkaz pro přesměrování, zásady vydavatele přepíší tuto verzi, nikoli verzi zadanou v manifestu.

Soubor zásad vydavatele se používá při aktualizaci sdílené komponenty a nová verze sdílené komponenty by měla být vyzvednuta všemi aplikacemi, které tuto komponentu používají. Nastavení v souboru zásad vydavatele přepíší nastavení v konfiguračním souboru aplikace, pokud konfigurační soubor aplikace nevynucuje nouzový režim.

Nouzový režim

Soubory zásad vydavatele jsou obvykle explicitně nainstalovány jako součást aktualizace Service Pack nebo aktualizace programu. Pokud dojde k potížím s upgradovanou sdílenou komponentou, můžete přepsání v souboru zásad vydavatele ignorovat pomocí nouzového režimu. Nouzový režim je určen prvkem <, který se nachází pouze v konfiguračním souboru aplikace. Určuje, zda se mají z procesu připojení odebrat informace o konfiguraci zásad vydavatele.

Nouzový režim lze nastavit pro celou aplikaci nebo pro vybraná sestavení. To znamená, že můžete zásadu vypnout pro všechna sestavení, která tvoří aplikaci, nebo ji zapnout pro některá sestavení, ale ne pro jiná. Chcete-li selektivně použít zásady vydavatele na sestavení, která tvoří aplikaci, nastavte <publisherPolicy apply=no/> a určete, která sestavení chcete ovlivnit pomocí <>. Pokud chcete použít zásady vydavatele pro všechna sestavení, která tvoří aplikaci, nastavte <publisherPolicy apply=no/> bez závislých prvků sestavení. Další informace o konfiguraci najdete v tématu Konfigurace aplikací pomocí konfiguračních souborů.

Konfigurační soubor počítače

Za třetí modul runtime prozkoumá konfigurační soubor počítače. Tento soubor s názvem Machine.configse nachází v místním počítači v podadresáři konfigurace kořenového adresáře, ve kterém je nainstalován modul runtime. Tento soubor mohou používat správci k určení omezení vazby sestavení, která jsou místní pro daný počítač. Nastavení v konfiguračním souboru počítače mají přednost před všemi ostatními nastaveními konfigurace; to ale neznamená, že by do tohoto souboru měla být vložena všechna nastavení konfigurace. Verze určená souborem zásad správce je konečná a nelze ji přepsat. Přepsání zadaná v souboru Machine.config ovlivní všechny aplikace. Další informace o konfiguračních souborech najdete v tématu Konfigurace aplikací pomocí konfiguračních souborů.

Krok 2: Kontrola dříve odkazovaných sestavení

Pokud bylo požadované sestavení požadováno také v předchozích voláních, modul CLR (Common Language Runtime) používá sestavení, které je již načteno. To může mít důsledky při pojmenování sestavení, která tvoří aplikaci. Další informace o pojmenování sestavení naleznete v tématu Názvy sestavení.

Pokud se předchozí požadavek na sestavení nezdařil, následné požadavky na sestavení automaticky selhávají, aniž by se pokusily načíst sestavení. Počínaje rozhraním .NET Framework verze 2.0 se chyby vazby sestavení ukládají do mezipaměti a informace uložené v mezipaměti slouží k určení, zda se má sestavení načíst.

Poznámka:

Pokud se chcete vrátit k chování rozhraní .NET Framework verze 1.0 a 1.1, která neukládala selhání vazby do mezipaměti, zahrňte <disableCachingBindingFailures> prvek do konfiguračního souboru.

Krok 3: Kontrola globální mezipaměti sestavení

U sestavení se silným názvem pokračuje proces vazby vyhledáváním v globální mezipaměti sestavení. Globální mezipaměť sestavení ukládá sestavení, která lze použít několika aplikacemi v počítači. Všechna sestavení v globální mezipaměti sestavení musí mít silné jména.

Krok 4: Vyhledání sestavení prostřednictvím kódových základen nebo prohledávání

Po určení správné verze sestavení pomocí informací v odkazu volajícího sestavení a v konfiguračních souborech, a po kontrole globální mezipaměti sestavení (pouze pro sestavení se silným názvem), se modul CLR (Common Language Runtime) pokouší najít sestavení. Proces vyhledání sestavení zahrnuje následující kroky:

  1. Pokud je prvek codeBase< nalezen v konfiguračním> souboru aplikace, modul runtime zkontroluje zadané umístění. Pokud se najde shoda, použije se toto sestavení a neprobíhá žádné zkoumání. Pokud tam sestavení není nalezeno, vazební požadavek selže.

  2. Modul runtime pak testuje odkazované sestavení pomocí pravidel uvedených dále v této části.

Poznámka:

Pokud máte v adresáři více verzí sestavení a chcete odkazovat na konkrétní verzi tohoto sestavení, je nutné použít prvek <codeBase> namísto atributu privatePath. Pokud použijete <sondovací> prvek, modul runtime zastaví sondu při prvním zjištění sestavení, které odpovídá názvu jednoduchého sestavení, na který odkazuje, bez ohledu na to, zda se jedná o správnou shodu nebo ne. Pokud se jedná o správnou shodu, použije se toto sestavení. Pokud není správná shoda, zastaví se sonda a vazba selže.

Vyhledání knihovny prostřednictvím kódových základen

Informace o základu kódu lze poskytnout pomocí elementu <codeBase> v konfiguračním souboru. Tato kódová základna se vždy kontroluje před pokusem modulu runtime o hledání odkazovaného sestavení. Pokud soubor zásad vydavatele obsahující přesměrování konečné verze také zahrnuje prvek <codeBase>, pak je to právě tento <prvek codeBase>, který se používá. Pokud například konfigurační soubor aplikace určuje <element codeBase> a soubor zásad vydavatele, který přepisuje informace o aplikaci také určuje <element codeBase> , <použije se element codeBase> v souboru zásad vydavatele.

Pokud se v umístění určeném <elementem codeBase> nenajde žádná shoda, požadavek vazby selže a neprovedou se žádné další kroky. Pokud modul runtime zjistí, že sestavení odpovídá kritériím volajícího sestavení, použije toto sestavení. Při načítání souboru určeného daným <elementem codeBase> prostředí runtime zkontroluje, zda název, verze, jazyková verze a veřejný klíč odpovídají odkazu volajícího sestavení.

Poznámka:

Odkazovaná sestavení mimo kořenový adresář aplikace musí mít silná pojmenování a musí být buď nainstalována v globální mezipaměti sestavení, nebo specifikována pomocí prvku <codeBase>.

Vyhledání sestavení prostřednictvím zkušebního testování

Pokud v konfiguračním souboru aplikace neexistuje žádný <prvek codeBase>, modul runtime hledá sestavení pomocí čtyř kritérií:

  • Základ aplikace, což je kořenové umístění, kde se aplikace spouští.

  • Atribut kultura, což je kulturní nastavení odkazovaného sestavení.

  • Název, což je název odkazovaného sestavení.

  • Atribut privatePath prvku <probing>, což je uživatelem definovaný seznam podadresářů v kořenovém umístění. Toto umístění lze zadat v konfiguračním souboru aplikace a ve spravovaném kódu pomocí AppDomainSetup.PrivateBinPath vlastnosti domény aplikace. Při zadání ve spravovaném kódu se spravovaný kód privatePath nejprve probírá a za ní následuje cesta zadaná v konfiguračním souboru aplikace.

Zkoumání adresářů základy aplikace a kulturních adresářů

Runtime vždy začíná zkoumáním v základní části aplikace, což může být buď URL adresa, nebo kořenový adresář aplikace v počítači. Pokud odkazované sestavení není v základním adresáři aplikace nalezeno a nejsou k dispozici žádné informace o jazykové verzi, modul runtime vyhledá všechny podadresáře obsahem názvu sestavení. Adresáře, které jsou prozkoumány, zahrnují:

  • [základ aplikace] / [název sestavení].dll

  • [základ aplikace] / [název sestavení] / [název sestavení].dll

Pokud jsou pro odkazované sestavení zadány kulturní informace, jsou probírány pouze následující adresáře:

  • [základ aplikace] / [jazyková verze] / [název sestavení].dll

  • [základ aplikace] / [kultura] / [název sestavení] / [název sestavení].dll

Testování pomocí atributu privatePath

Kromě podadresářů jazykové verze a podadresářů pojmenovaných podle odkazovaného assembly zkoumá modul runtime také adresáře, které jsou uvedeny pomocí atributu prvku privatePath. Adresáře zadané pomocí atributu privatePath musí být podadresáře kořenového adresáře aplikace. Adresáře se liší v závislosti na tom, jestli jsou informace o jazykové verzi zahrnuté v odkazovaném požadavku na sestavení.

Modul runtime zastaví proces vyhledávání ve chvíli, kdy poprvé najde sestavení, které odpovídá názvu jednoduchého sestavení, na nějž odkazuje, bez ohledu na to, zda se jedná o správnou shodu. Pokud se jedná o správnou shodu, použije se toto sestavení. Pokud není správná shoda, zastaví se sonda a vazba selže.

Pokud je zahrnuta kultura, zkoumají se následující adresáře:

  • [základ aplikace] / [binpath] / [culture] / [název sestavení].dll

  • [základ aplikace] / [binpath] / [culture] / [název sestavení] / [název sestavení].dll

Pokud informace o jazykové verzi nejsou zahrnuté, probírá se následující adresáře:

  • [základ aplikace] / [binpath] / [název sestavení].dll

  • [základ aplikace] / [binpath] / [název sestavení] / [název sestavení].dll

Příklady sondování

S ohledem na následující informace:

Modul runtime testuje následující adresy URL:

  • http://www.code.microsoft.com/de/myAssembly.dll

  • http://www.code.microsoft.com/de/myAssembly/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly.dll

  • http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll

Více sestavení se stejným názvem

Následující příklad ukazuje, jak nakonfigurovat více sestavení se stejným názvem.

<dependentAssembly>
   <assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
   <codeBase version="1.0.0.0" href="v1/Server.dll" />
   <codeBase version="2.0.0.0" href="v2/Server.dll" />
</dependentAssembly>

Další lokality zkoumány

Umístění sestavení lze také určit pomocí aktuálního kontextu vazby. K tomu nejčastěji dochází při použití metody Assembly.LoadFrom a ve scénářích spolupráce s COM. Pokud sestavení používá metodu LoadFrom k odkazu na jiné sestavení, umístění volajícího sestavení je považováno za nápovědu o tom, kde najít odkazované sestavení. Pokud se najde shoda, toto sestavení se načte. Pokud se nenajde žádná shoda, modul runtime pokračuje ve vyhledávání podle svých sémantických pravidel a potom se dotáže instalační služby systému Windows, aby poskytla sestavení. Pokud není k dispozici žádné sestavení odpovídající požadavku na vazbu, dojde k vyvolání výjimky. Tato výjimka je ve spravovaném kódu TypeLoadException, pokud je typ odkazován, nebo FileNotFoundException, pokud nebylo nalezeno sestavení při načítání.

Pokud například Sestavení1 odkazuje na Sestavení2 a Sestavení1 byl stažen z http://www.code.microsoft.com/utils, toto umístění je považováno za nápovědu, kde najít Assembly2.dll. Modul runtime pak vyhledává sestavení v http://www.code.microsoft.com/utils/Assembly2.dll a http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Pokud není sestavení Assembly2 nalezeno v žádném z těchto umístění, modul runtime se obrátí na instalační službu systému Windows.

Viz také