.NET Framework - .NET Framework

.NET Framework
.NET Logo.svg
DotNet.svg
Zásobník komponent .NET Framework
Vývojáři Microsoft
První vydání 14. února 2002 ; Před 19 lety ( 2002-02-14 )
Konečné vydání
4.8.0 Build 3928 / 25. července 2019 ; Před 2 roky ( 2019-07-25 )
Operační systém Windows 98 nebo novější, Windows NT 4.0 nebo novější
Plošina IA-32 , x86-64 a ARM
Nástupce .SÍŤ
Typ Softwarový rámec
Licence Smíšený; viz § Licencování
webová stránka dotnet .microsoft .com Upravte to na Wikidata

.NET Framework (vyslovováno jako " dot net" ) je framework software vyvinutý společností Microsoft , která běží v první řadě na Microsoft Windows . Obsahuje velkou knihovnu tříd nazvanou Framework Class Library (FCL) a poskytuje jazykovou interoperabilitu (každý jazyk může používat kód napsaný v jiných jazycích) v několika programovacích jazycích . Programy napsané pro .NET Framework se spouští v softwarovém prostředí (na rozdíl od hardwarového prostředí) s názvem Common Language Runtime (CLR). CLR je aplikační virtuální počítač, který poskytuje služby, jako je zabezpečení, správa paměti a zpracování výjimek . Počítačový kód napsaný pomocí .NET Framework se proto nazývá „ spravovaný kód “. FCL a CLR společně tvoří .NET Framework.

FCL poskytuje uživatelské rozhraní , přístup k datům , připojení k databázi , kryptografii , vývoj webových aplikací , numerické algoritmy a síťovou komunikaci . Programátoři vytvářejí software kombinací jejich zdrojového kódu s .NET Framework a dalšími knihovnami. Rámec je určen k použití většinou nových aplikací vytvořených pro platformu Windows. Microsoft také vyrábí integrované vývojové prostředí pro software .NET s názvem Visual Studio .

.NET Framework začínal jako proprietární software , ačkoli firma pracovala na standardizaci softwarového balíku téměř okamžitě, dokonce ještě před jeho prvním vydáním. Navzdory snaze o standardizaci vývojáři, zejména ti, kteří jsou v komunitách svobodného a otevřeného softwaru , vyjádřili své znepokojení nad vybranými podmínkami a vyhlídkami na jakoukoli bezplatnou a open-source implementaci, zejména pokud jde o softwarové patenty . Od té doby Microsoft změnil vývoj .NET, aby více sledoval současný model komunitně vyvinutého softwarového projektu, včetně vydání aktualizace svého patentu slibujícího řešení problémů.

V dubnu 2019 vydala společnost Microsoft .NET Framework 4.8, poslední verzi rámce, jako proprietární nabídku. Od té doby byly pro tuto verzi vydávány pouze měsíční opravy chyb zabezpečení a spolehlivosti. Žádné další změny této verze nejsou plánovány.

Dějiny

Microsoft začal vyvíjet .NET Framework na konci 90. let, původně pod názvem Next Generation Windows Services (NGWS), jako součást strategie .NET . Počátkem roku 2000 byly vydány první beta verze .NET 1.0.

V srpnu 2000 Microsoft a Intel pracovali na standardizaci Common Language Infrastructure (CLI) a C# . V prosinci 2001 byly oba ratifikovány standardy Ecma International (ECMA). V dubnu 2003 následovala Mezinárodní organizace pro normalizaci (ISO). Aktuální verze norem ISO jsou ISO/IEC 23271: 2012 a ISO/IEC 23270: 2006.

Zatímco společnost Microsoft a její partneři vlastní patenty pro CLI a C#, ECMA a ISO vyžadují, aby všechny patenty nezbytné pro implementaci byly k dispozici za „ rozumných a nediskriminačních podmínek “. Firmy souhlasily se splněním těchto podmínek a poskytnutím patentů bez licenčních poplatků. To však neplatilo pro část .NET Framework, na kterou se nevztahují standardy ECMA-ISO, která zahrnovala Windows Forms , ADO.NET a ASP.NET . Patenty, které má společnost Microsoft v těchto oblastech, mohly odradit implementace celého rámce od jiných společností než Microsoft.

Dne 3. října 2007 společnost Microsoft oznámila, že zdrojový kód pro knihovny .NET Framework 3.5 měl být dostupný pod licencí Microsoft Reference Source License (Ms-RSL). Úložiště zdrojových kódů bylo k dispozici online 16. ledna 2008 a obsahovalo BCL, ASP.NET, ADO.NET, Windows Forms, WPF a XML. Scott Guthrie ze společnosti Microsoft slíbil, že budou přidávány knihovny LINQ, WCF a WF.

.NET Compact Framework a .NET Framework Micro varianty .NET Framework poskytované podpory pro jiné platformy společnosti Microsoft, jako Windows Mobile , Windows CE a dalších vestavěných zařízení s omezenými zdroji. Silverlight poskytoval podporu pro webové prohlížeče prostřednictvím zásuvných modulů.

Logo Microsoft .NET Framework v4.5

V listopadu 2014 společnost Microsoft také vytvořila aktualizaci svých patentových udělení, která dále rozšiřuje rozsah mimo její předchozí zástavy. Předchozí projekty, jako je Mono, existovaly v legální šedé oblasti, protože dřívější granty společnosti Microsoft se vztahovaly pouze na technologii v „krytých specifikacích“, včetně striktně 4. vydání, každé z ECMA-334 a ECMA-335. Nový patentový příslib však neklade žádný limit na specifikaci verze a dokonce se vztahuje na jakékoli runtime technologie .NET dokumentované na MSDN, které nebyly formálně specifikovány skupinou ECMA, pokud se projekt rozhodne je implementovat. To umožňuje Mono a dalším projektům zachovat paritu funkcí s moderními funkcemi .NET, které byly zavedeny od vydání 4. vydání, aniž by hrozilo riziko soudního sporu ohledně implementace těchto funkcí. Nový grant zachovává omezení, že jakákoli implementace musí udržovat minimální soulad s povinnými částmi specifikace CLI.

Dne 31. března 2016 společnost Microsoft oznámila na Microsoft Build , že budou zcela relicencovat Mono pod licencí MIT, a to i ve scénářích, kde dříve byla potřeba komerční licence. Microsoft také doplnil svůj předchozí patentový příslib pro Mono a uvedl, že nebudou uplatňovat žádné „příslušné patenty“ vůči stranám, které „používají, prodávají, nabízejí k prodeji, importují nebo distribuují Mono“. Bylo oznámeno, že projekt Mono byl přispěn nadaci .NET Foundation. Tento vývoj následoval po akvizici Xamarinu , která začala v únoru 2016 a byla dokončena 18. března 2016.

Tisková zpráva společnosti Microsoft zdůrazňuje, že závazek napříč platformami nyní umožňuje plně otevřený zdrojový, moderní zásobník .NET na straně serveru. Společnost Microsoft vydala 4. prosince 2018 zdrojový kód pro WPF, Windows Forms a WinUI.

Architektura

Vizuální přehled infrastruktury Common Language Infrastructure (CLI)

Společná jazyková infrastruktura

Common Language Infrastructure (CLI) poskytuje jazykově neutrální platformu pro vývoj a provádění aplikací. Implementací základních aspektů .NET Framework v rámci CLI nebudou tyto funkce svázány s jedním jazykem, ale budou k dispozici v mnoha jazycích podporovaných rámcem.

Společný jazykový modul runtime

.NET Framework obsahuje modul CLR (Common Language Runtime). Slouží jako modul spouštění .NET Framework a nabízí mnoho služeb, jako je správa paměti , bezpečnost typů , zpracování výjimek , shromažďování odpadků , zabezpečení a správa vláken . Všechny programy napsané pro .NET Framework spouští CLR.

Programy napsané pro .NET Framework jsou kompilovány do kódu CIL ( Common Intermediate Language ), na rozdíl od přímého kompilace do strojového kódu . Během provádění kompilátor just-in-time (JIT) specifický pro architekturu změní kód CIL na strojový kód.

Sestavy

Zkompilovaný kód CIL je uložen v sestavách CLI . Jako zmocněnec specifikaci sestavy jsou uloženy v Portable Executable (PE) formátu, společné sociální zařízení na platformě Windows pro všechny dynamické knihovny (DLL) a spustitelné EXE soubory. Každá sestava se skládá z jednoho nebo více souborů, z nichž jeden musí obsahovat manifest nesoucí metadata sestavy. Úplný název sestavení (nezaměňovat s názvem souboru na disku) obsahuje jeho jednoduchý textový název, číslo verze, jazykovou verzi a token veřejného klíče . Sestavy jsou považovány za rovnocenné, pokud sdílejí stejný úplný název.

Soukromý klíč může také použít tvůrce sestavy pro silné pojmenování . Token veřejného klíče identifikuje, se kterým soukromým klíčem je sestavení podepsáno. Pouze tvůrce dvojice klíčů (obvykle osoba podepisující sestavení) může podepisovat sestavy, které mají stejný silný název jako sestavení předchozí verze, protože tvůrce vlastní soukromý klíč. K přidání sestavení do globální mezipaměti sestavení je nutné silné pojmenování .

Počínaje Visual Studio 2015, .NET Nativní technologie kompilace umožňuje kompilaci .NET kódu aplikací Universal Windows Platform přímo do strojového kódu, nikoli do kódu CIL, ale aplikace musí být napsána buď v C#, nebo Visual Basic.NET.

Třídní knihovna

.NET Framework obsahuje implementaci CLI foundational Standard Libraries . Knihovna tříd .NET Framework (FCL) je organizována v hierarchii oborů názvů . Většina vestavěných rozhraní pro programování aplikací (API) je součástí buď jmenných prostorů, System.*nebo Microsoft.*jmenných prostorů. Tyto knihovny tříd implementují mnoho běžných funkcí, jako je čtení a zápis souborů, vykreslování grafiky, interakce s databází a manipulace s dokumenty XML. Knihovny tříd jsou k dispozici pro všechny jazyky kompatibilní s CLI . FCL implementuje knihovnu CLI Base Class Library (BCL) a další knihovny tříd - některé jsou specifikovány CLI a jiné jsou specifické pro Microsoft.

BCL obsahuje malou podmnožinu celé knihovny tříd a je základní sadou tříd, které slouží jako základní API CLR. NET Framework Většina tříd považovány za součást BCL bydlí v mscorlib.dll, System.dlla System.Core.dll. Třídy BCL jsou k dispozici v .NET Framework i jeho alternativních implementacích včetně .NET Compact Framework , Microsoft Silverlight , .NET Core a Mono .

FCL odkazuje na celou knihovnu tříd dodávanou s .NET Framework. Obsahuje rozšířenou sadu knihoven, včetně BCL, Windows Forms , ASP.NET a Windows Presentation Foundation (WPF), ale také rozšíření knihoven základních tříd ADO.NET , Language Integrated Query (LINQ), Windows Communication Foundation (WCF) a Workflow Foundation (WF). FCL má mnohem větší rozsah než standardní knihovny pro jazyky jako C ++ a rozsahem je srovnatelný se standardními knihovnami Javy .

Se zavedením alternativních implementací (např. Silverlight) Microsoft představil koncept přenosných knihoven tříd (PCL), které umožňují náročné knihovně běžet na více než jedné platformě. S dalším rozšířením platforem .NET se přístup PCL nepodařilo škálovat (PCL jsou definované průsečíky povrchu API mezi dvěma nebo více platformami). Jako další evoluční krok PCL byla .NET standardní knihovna vytvořena zpětně na základě System.Runtime.dllzaložených API nalezených v UWP a Silverlight. Nové platformy .NET se vyzývají, aby implementovaly verzi standardní knihovny, která jim umožní znovu použít existující knihovny třetích stran ke spuštění bez jejich nových verzí. .NET standardní knihovna umožňuje nezávislou evoluci vrstev modelu knihovny a aplikace v rámci architektury .NET.

NuGet je správce balíčků pro všechny platformy .NET. Používá se k načítání knihoven třetích stran do projektu .NET s globálním zdrojem knihoven na NuGet.org. Soukromé kanály lze spravovat samostatně, například pomocí serveru sestavení nebo adresáře systému souborů.

C ++/CLI

Společnost Microsoft představila C ++/CLI v aplikaci Visual Studio 2005, což je jazyk a prostředky pro kompilaci programů Visual C ++, které lze spustit v rozhraní .NET Framework. Některé části programu C ++ stále běží v rámci nespravovaného modulu Visual C ++ Runtime, zatímco speciálně upravené části jsou přeloženy do kódu CIL a spuštěny pomocí CLR .NET Framework .

Sestavy kompilované pomocí kompilátoru C ++/CLI se nazývají sestavení ve smíšeném režimu, protože obsahují nativní a spravovaný kód ve stejné knihovně DLL. Takováto sestavení jsou pro reverzní inženýrství složitější, protože dekompilátory .NET, jako je .NET Reflector, odhalují pouze spravovaný kód.

Princip designu

Interoperabilita

Protože počítačové systémy běžně vyžadují interakci mezi novějšími a staršími aplikacemi, .NET Framework poskytuje prostředky pro přístup k funkcím implementovaným v novějších a starších programech, které se spouští mimo prostředí .NET. Přístup k objektu Component Model (COM) komponenty jsou uvedeny v System.Runtime.InteropServicesa System.EnterpriseServicesjmenné prostory tohoto rámce. Přístup k dalším funkcím je prostřednictvím Platform Invocation Services (P/Invoke). Přístup k funkcím .NET z nativních aplikací je prostřednictvím reverzní funkce P/Invoke.

Jazyková nezávislost

.NET Framework zavádí Common Type System (CTS), který definuje všechny možné datové typy a programovací konstrukce podporované CLR a jak mohou nebo nemusí interagovat v souladu se specifikací CLI. Kvůli této funkci .NET Framework podporuje výměnu typů a instancí objektů mezi knihovnami a aplikacemi napsanými pomocí jakéhokoli vyhovujícího jazyka .NET .

Bezpečnost typu

CTS a CLR používané v .NET Framework také vynucují bezpečnost typů . Tím se zabrání špatně definovaným přetypováním, vyvolání nesprávných metod a problémům s velikostí paměti při přístupu k objektu. Díky tomu je většina jazyků CLI staticky zadaná (s odvozením typu nebo bez něj ). Počínaje .NET Framework 4.0 však Dynamic Language Runtime rozšířil CLR, což umožňuje implementaci dynamicky zadaných jazyků na CLI.

Přenosnost

Přestože společnost Microsoft nikdy neimplementovala úplný rámec na žádném systému kromě systému Microsoft Windows, vytvořila rámec pro více platforem a implementace jsou k dispozici pro jiné operační systémy (viz Silverlight a § Alternativní implementace ). Společnost Microsoft předložila specifikace pro CLI (zahrnující knihovny základních tříd, CTS a CIL), C# a C ++/CLI jak Ecma International (ECMA), tak International Organization for Standardization (ISO), čímž je zpřístupnila jako oficiální standardy. To umožňuje třetím stranám vytvářet kompatibilní implementace rámce a jeho jazyků na jiných platformách.

Bezpečnostní

.NET Framework má svůj vlastní bezpečnostní mechanismus se dvěma obecnými funkcemi: Code Access Security (CAS) a ověřování a ověřování. CAS je založen na důkazech, které jsou spojeny s konkrétní sestavou. Obvykle je důkazem zdroj sestavení (ať už je nainstalován na místním počítači nebo byl stažen z internetu). CAS používá důkazy k určení oprávnění udělených kódu. Jiný kód může požadovat, aby volajícímu kódu bylo uděleno určené oprávnění. Poptávka způsobí, že CLR provede procházení zásobníku volání: každé sestavení každé metody v zásobníku volání je zkontrolováno na požadované oprávnění; pokud některému sestavení není uděleno oprávnění, je vyvolána výjimka zabezpečení.

Spravovaný bytecode CIL je snadnější zpětně analyzovat než nativní kód, pokud není zmaten . Programy dekompilace .NET umožňují vývojářům bez dovedností reverzního inženýrství zobrazit zdrojový kód za nezrušenými sestaveními .NET. Naproti tomu aplikace kompilované do nativního strojového kódu je mnohem obtížnější zpětně analyzovat a zdrojový kód se téměř nikdy nevyrábí úspěšně, hlavně kvůli optimalizaci kompilátoru a nedostatku reflexe . To v podnikatelské komunitě vyvolává obavy z možné ztráty obchodního tajemství a obcházení mechanismů kontroly licencí. Aby to bylo možné zmírnit, společnost Microsoft od roku 2002 zahrnula Dotfuscator Community Edition s Visual Studio .NET . Nástroje pro zmatení třetích stran jsou k dispozici také od dodavatelů, jako jsou VMware , Vi Labs , Turbo a Red Gate Software . Šifrovací nástroje na úrovni metod pro kód .NET jsou k dispozici od dodavatelů, jako je SafeNet .

Správa paměti

CLR osvobozuje vývojáře od zátěže správy paměti (přidělování a uvolňování po dokončení); zvládá samotnou správu paměti tím, že detekuje, kdy lze paměť bezpečně uvolnit. Instance typů (objektů) .NET jsou přidělovány ze spravované haldy; fond paměti spravovaný CLR. Dokud existuje odkaz na objekt, který může být buď přímý, nebo prostřednictvím grafu objektů, je objekt považován za používaný. Pokud neexistuje žádný odkaz na objekt a nelze jej dosáhnout ani použít, stane se z něj odpadek způsobilý pro sběr.

.NET Framework obsahuje garbage collector (GC), který se spouští pravidelně, na samostatném vlákně od vlákna aplikace, které vyjmenovává všechny nepoužitelné objekty a uvolňuje jim přidělenou paměť. Jedná se o non-deterministický, lisování, mark-and-sweep garbage collector. GC běží pouze tehdy, když bylo použito určité množství paměti nebo je v paměti dostatečný tlak na paměť. Protože není zaručeno, že jsou dosaženy podmínky pro získání paměti, běhy GC nejsou deterministické . Každá aplikace .NET má sadu kořenů, což jsou ukazatele na objekty na spravované haldě ( spravované objekty ). Patří sem odkazy na statické objekty, objekty definované jako lokální proměnné nebo parametry metody, které jsou aktuálně v oboru, a objekty, na které odkazují registry CPU. Když GC běží, pozastaví aplikaci a poté pro každý objekt uvedený v kořenovém adresáři rekurzivně vytvoří výčet všech objektů dosažitelných z kořenových objektů a označí je jako dosažitelné. Pomocí metadat a reflexe CLI objevuje objekty zapouzdřené objektem a poté je rekurzivně prochází. Potom pomocí reflexe vytvoří výčet všech objektů na haldě (které byly původně přiděleny souvisle). Všechny objekty, které nejsou označeny jako dosažitelné, jsou odpadky. Toto je fáze značky . Protože paměť držená odpadky nemá žádný význam, je považována za volné místo. To však ponechává kusy volného prostoru mezi objekty, které byly původně sousedící. Objekty jsou poté zkomprimovány dohromady, aby volné místo na spravované haldě opět sousedilo. Jakýkoli odkaz na objekt zneplatněný přesunutím objektu je aktualizován GC tak, aby odrážel nové umístění. Po ukončení shromažďování odpadků se aplikace obnoví. Nejnovější verze rozhraní .NET Framework používá souběžné uvolňování paměti spolu s uživatelským kódem, takže pozastavení je nepostřehnutelné, protože se provádí na pozadí.

Sběrač odpadků používaný .NET Framework je také generační . Objektům je přiřazena generace . Nově vytvořené objekty jsou označeny generací 0 . Objekty, které přežijí jednu sbírku odpadků, jsou označeny Generací 1 . Objekty generace 1, které přežily další kolekci, jsou generace 2 . Rámec používá až objekty 2. generace. Objekty vyšší generace jsou shromažďovány méně často než objekty nižší generace. To zvyšuje účinnost shromažďování odpadků, protože starší objekty mívají delší životnost než novější objekty. Ignorováním starších objektů ve většině běhů kolekce je celkem zapotřebí méně kontrol a operací zhutňování.

Výkon

Při prvním spuštění aplikace .NET Framework zkompiluje kód CIL do spustitelného kódu pomocí kompilátoru just-in-time a uloží spustitelný program do mezipaměti nativní bitové kopie .NET. Kvůli ukládání do mezipaměti se aplikace spouští rychleji pro následná spuštění, i když první spuštění je obvykle pomalejší. Aby urychlili první spuštění, mohou vývojáři použít nástroj Native Image Generator k ručnímu předčasnému kompilaci a ukládání do mezipaměti jakékoli aplikace .NET.

Sběrač odpadků, který je integrován do prostředí, může zavést neočekávané zpoždění provádění, nad nimiž má vývojář malou přímou kontrolu. „Ve velkých aplikacích může být počet předmětů, se kterými musí popelář pracovat, velmi velký, což znamená, že jejich návštěva a přeskupení může trvat velmi dlouho.“

.NET Framework poskytuje podporu pro volání Streaming SIMD Extensions (SSE) prostřednictvím spravovaného kódu od dubna 2014 v aplikaci Visual Studio 2013 Update 2. Mono však poskytuje podporu pro SIMD Extensions od verze 2.2 v rámci oboru názvů Mono.Simd v roce 2009. Vedoucí Mono vývojář Miguel de Icaza vyjádřil naději, že tato podpora SIMD bude přijata standardem CLR ECMA. Streamingová rozšíření SIMD jsou k dispozici v procesorech x86 od představení Pentium III . Některé další architektury jako ARM a MIPS mají také rozšíření SIMD. V případě, že CPU postrádá podporu pro tato rozšíření, jsou pokyny simulovány v softwaru.

Alternativní implementace

.NET Framework byl převládající implementací technologií .NET až do vydání .NET . Existují další implementace pro části rámce. Přestože je modul runtime popsán specifikací ECMA-ISO, jeho další implementace mohou být zatíženy problémy s patenty ; Normy ISO mohou obsahovat prohlášení o vyloučení odpovědnosti: „Je třeba věnovat pozornost možnosti, že některé prvky tohoto dokumentu mohou být předmětem patentových práv. ISO nenese odpovědnost za identifikaci jakýchkoli nebo všech takových patentových práv.“ Je těžší vyvinout alternativy k FCL, které nejsou popsány v otevřeném standardu a mohou podléhat omezení autorských práv. Části FCL mají také funkce a chování specifické pro Windows, takže implementace na platformách jiných než Windows může být problematická.

Zde jsou uvedeny některé alternativní implementace částí rámce.

  • .NET Micro Framework je .NET platforma pro extrémně omezená zařízení. Obsahuje malou verzi CLR a podporuje vývoj v C# (ačkoli někteří vývojáři dokázali používat VB.NET , i když s množstvím hackerů as omezenými funkcemi) a ladění (v emulátoru nebo na hardwaru), oba pomocí Microsoft Visual Studio . Obsahuje také podmnožinu .NET Framework Class Library (asi 70 tříd s přibližně 420 metodami), GUI framework volně založený na WPF a další knihovny specifické pro vložené aplikace.
  • Mono je implementací CLI a FCL a poskytuje přidané funkce. Je licencován jako bezplatný software pod licencí MIT . Obsahuje podporu pro knihovny ASP.NET, ADO.NET a Windows Forms pro širokou škálu architektur a operačních systémů. Obsahuje také kompilátory C# a VB.NET.
  • Portable.NET (součást DotGNU ) poskytuje implementaci CLI, částí FCL a kompilátoru C#. Podporuje řadu CPU a operačních systémů. Projekt byl přerušen, přičemž poslední stabilní vydání bylo v roce 2009.
  • Microsoft Shared Source Common Language Infrastructure je nesvobodná implementace CLR. Poslední verze však běží pouze na Windows XP SP2 a od roku 2006 nebyla aktualizována. Neobsahuje tedy všechny funkce verze .NET Framework 2.0.
  • CrossNet je implementace CLI a částí FCL. Jedná se o bezplatný software využívající open source licenci MIT .

Licencování

Rámce spravovaného kódu Microsoft a jejich součásti jsou licencovány následovně:

Komponent Licence
.NET Framework (redistribuovatelný balíček) Proprietární software
Referenční zdrojový kód .NET Framework 4.5 a starší Referenční licence Microsoft (Ms-RSL)
Referenční zdrojový kód .NET Framework 4.6 Licence MIT
Mono Licence MIT
.NET (dříve .NET Core)
CoreFX, CoreCLR a CLI
Licence MIT
.NET Micro Framework Licence Apache 2.0
.NET Compiler Platform (kódové označení „Roslyn“) Licence MIT
ASP.NET MVC , Web API a Web Pages ( Razor ) Licence Apache 2.0
ASP.NET Core Licence Apache 2.0
Sada nástrojů ASP.NET Ajax Control Licence BSD
Signál ASP.NET Licence Apache 2.0
Entity Framework Licence Apache 2.0
NuGet Licence Apache 2.0

Viz také

Poznámky

Reference

externí odkazy