Jak běhové prostředí vyhledává 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.

Iniciování vazby

Proces vyhledání a vazby na sestavení začíná, když se modul runtime pokusí přeložit 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 použijete některou z různých metod načítání sestavení, jako Assembly.Load je například nebo AppDomain.Load.

Nakonec můžete vytvořit dynamický odkaz pomocí metody, jako Assembly.Load je například a poskytnout pouze částečné informace. Pak kvalifikujete odkaz pomocí elementu <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 k 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. Zkontroluje, zda byl název sestavení vázán před a pokud ano, používá dříve načtené sestavení. Pokud předchozí požadavek na načtení sestavení selhal, požadavek se okamžitě nezdaří bez pokusu o načtení 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 sestavení 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í Assembly.LoadFrom metody, modul runtime vyhledá nápovědu k 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. Sondy pro sestavení pomocí heuristiky popsané v části sondy. 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í sestavení bez silných názvů, ani kontrola za běhu v globální mezipaměti sestavení pro sestavení bez silných názvů.

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 <element assemblyBinding>, který přesměruje proces vazby. Podřízené elementy <assemblyBinding> element zahrnují< dependentAssembly> element. Podřízené položky dependentAssembly> element 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 <element odkazu> 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á do Listeners kolekce záznam TextWriterTraceListener 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 počítačů jsou soubory zásad vydavatele obsaženy ve vlastním sestavení, které musí být nainstalovány v 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, například takto:

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 určuje publisherPolicy apply="yes|ne"/> element, který se <nachází pouze v konfiguračním souboru aplikace. Určuje, jestli se mají z procesu vazby 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í závislého elementuAssembly><.< 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.config se nachází v místním počítači v podadresáři konfigurace kořenového adresáře, kde 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 předchozí požadavek na sestavení selhal, následné žádosti o sestavení se okamžitě nezdaří bez pokusu o načtení 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á neuložila selhání vazby do mezipaměti, zahrňte do <konfiguračního souboru element disableCachingBindingFailures>.

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

U sestavení se silným názvem proces vazby pokračuje 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é názvy.

Krok 4: Vyhledání sestavení prostřednictvím základů kódu nebo zjišťování

Po určení správné verze sestavení pomocí informací v odkazu volajícího sestavení a v konfiguračních souborech a po vrácení se změnami do globální mezipaměti sestavení (pouze pro sestavení se silným názvem), modul CLR (Common Language Runtime) se pokusí 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íná se žádná sonda. Pokud tam sestavení není nalezeno, požadavek na vazbu 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 element codeBase> namísto privatePath atributu< prvku probing>.< 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í sestavení prostřednictvím základu kódu

Informace o základu kódu lze poskytnout pomocí elementu <codeBase> v konfiguračním souboru. Tento základ kódu se vždy kontroluje před pokusem modulu runtime o sondu pro odkazované sestavení. Pokud soubor zásad vydavatele obsahující konečné verze redirect obsahuje <také element codeBase> , je tento <element codeBase> prvek, 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čtení souboru určeného daným <elementem codeBase> modul 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é názvy a musí být buď nainstalována v globální mezipaměti sestavení, nebo zadaná pomocí elementu <codeBase> .

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

Pokud v konfiguračním souboru aplikace neexistuje žádný <prvek codeBase> , sondy modulu runtime sestavení používající čtyři kritéria:

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

  • Jazyková verze, což je atribut jazykové verze odkazovaného sestavení.

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

  • Atribut privatePath<prvku probing> , což je seznam 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.

Zbídání adresářů základní aplikace a jazykové verze

Modul runtime vždy začíná probít v základu aplikace, což může být adresa URL nebo kořenový adresář aplikace v počítači. Pokud odkazované sestavení není v základu aplikace nalezeno a nejsou k dispozici žádné informace o jazykové verzi, modul runtime vyhledá všechny podadresáře s názvem sestavení. Mezi adresáře, které jsou proslovné, patří:

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

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

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

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

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

Testování pomocí atributu privatePath

Kromě podadresářů jazykové verze a podadresářů pojmenovaných pro odkazované sestavení modul runtime také testuje adresáře zadané pomocí privatePath atributu <prvku probing> . 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í první sondu, když najde sestavení, které odpovídá názvu jednoduchého sestavení, na který odkazuje, bez ohledu na to, jestli 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.

Pokud je součástí jazykové verze, probírá se následující adresáře:

  • [základ aplikace] / [binpath] / [jazyková verze] / [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 probívání

S ohledem na následující informace:

  • Odkazovaný název sestavení: myAssembly

  • Kořenový adresář aplikace: http://www.code.microsoft.com

  • <Prvek probing v konfiguračním> souboru určuje: bin

  • Jazyková verze: de

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>

Jiná umístění probedná

Umístění sestavení lze také určit pomocí aktuálního kontextu vazby. K tomu nejčastěji dochází při Assembly.LoadFrom použití metody a ve scénářích interoperability modelu COM. Pokud sestavení používá metodu LoadFrom odkazovat na jiné sestavení, volání umístění 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 s jeho sémantikou vyhledávání a potom se dotazuje instalační služby systému Windows, aby poskytl sestavení. Pokud není k dispozici žádné sestavení, které odpovídá požadavku vazby, vyvolá se výjimka. Tato výjimka je ve spravovaném TypeLoadException kódu, pokud byl typ odkazován, nebo FileNotFoundException pokud sestavení, které bylo načteno, nebylo nalezeno.

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 sonduje sestavení v http://www.code.microsoft.com/utils/Assembly2.dll a http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Pokud sestavení Assembly2 není v některém z těchto umístění nalezeno, modul runtime se dotazuje instalační služby systému Windows.

Viz také