Sdílet prostřednictvím


Čistý a ověřitelný kód

Programování rozhraní .NET jazyka Visual C++ podporuje vytváření tři rozdílných typů komponent a aplikací: smíšené, čisté a ověřitelné. Všechny tři jsou k dispozici prostřednictvím možnosti kompilátoru /clr (Common Language Runtime Compilation)

Poznámky

Další informace o ověřitelném sestavení naleznete v tématu:

Smíšené (/clr)

Smíšené sestavení (kompilované s /clr), obsahuje obě nespravované a spravované části, což jim umožňuje použítí funkce rozhraní .NET, ale stále obsahuje nespravovaný kód. To umožňuje aplikacím a komponentám aktualizovat použití funkcí rozhraní .NET bez nutnosti přepisovat celý projekt. Použití aplikace Visual C++ k promíchání spravovaného a nespravovaného kódu tímto způsobem se nazývá C++ Interop. Další informace naleznete v tématu Smíšená (nativní a spravovaná) sestavení a Nativní a vzájemná funkční spolupráce rozhraní .NET.

Čisté (/clr:pure)

Čistá sestavení (kompilováno s /clr:pure) mohou obsahovat nativní typy a typy spravovaných dat, ale pouze spravované funkce. Stejně jako smíšená sestavení, čistá sestavení umožňují spolupráci s nativními knihovnami DLL pomocí P/Invoke (viz Použití explicitního PInvoke v jazyce C++ (atribut DllImport)), ale funkce Interop jazyka C++ nejsou k dispozici. Kromě toho, čistá sestavení nemohou exportovat funkce, které jsou volány z nativních funkcí, protože vstupní body v čistém sestavení používají __clrcall konvenci volání.

Výhody /clr:pure

  • Vyšší výkon: Protože, čistá sestavení obsahuí pouze jazyk MSIL, neexistují žádné nativní funkce a z tohoto důvodu jsou nezbytné spravované/nespravované přechody. (Z tohoto pravidla je volání funkce prostřednictvím P/Invoke výjimkou).

  • Sledování domény aplikace: Spravované funkce a CLR datové typy existují uvnitř Application Domains, což ovlivní jejich viditelnost a usnadnění přístupu. Čistá sestavení jsou doménově informovatelné (__declspec(appdomain je implikovaná pro každý typ)), takže přístup k jejich typům a funkcionalita z jiných komponent rozhraní .NET je snazší a bezpečnější. Ve výsledku spoloupracují čistá sestavení snadněji s dalšími komponentami rozhraní .NET než smíšená sestavení.

  • Načítání bez uložení na disk: Čistá sestavení mohou být načteny v paměti a dokonce zpracována pomocí proudu. To je nezbytně nutné pro použití sestavení rozhraní .NET jako uložné procedury. Tím se liší od smíšených sestavení, které kvůli závislosti načítání mechanismů systému Windows, musí existovat na disku za účelem provedení.

  • Reflexe: Není možné provádět reflexi přes smíšené spustitelné soubory, zatímco čistá sestavení poskytují plnou podporu reflexe. Další informace naleznete v tématu Reflexe v C++.

  • Hostitelská ovladatelnost: Vzhledem k tomu, že čistá sestavení obsahují pouze jazyk MSIL, chovají se předvídatelněji a flexibilněji než smíšená sestavení při použití v aplikacích, které hostují CLR a upravují výchozí chování.

Omezení /clr:pure

Tato část zahrnuje aktuálně nepodporované funkce /clr:pure.

  • Čistá sestavení nelze volat nespravovanými funkcemi. Proto nemohou čistá sestavení implementovat rozhraní modelu COM nebo vystavit nativní zpětná volání. Čistá sestavení nemohou exportovat funkce prostřednictvím __declspec(dllexport) nebo .DEF soubory. Také funkce deklarovány s konvencemi __clrcall nelze importovat prostřednictvím __declspec(dllimport). Funkce v nativním modulu mohou být volány z čistého sestavení, ale čistá sestavení nemohou vystavit nativní zpětné volání funkcí. Takže vystavená funkcionalita v čistém sestavení musí být provedena skrze řízené funkce v kombinovaném sestavení. Další informace naleznete v tématu Postupy: Přenesení na /clr:pure.

  • Čistý režim kompilace v jazyce C++ knihovny ATL a MFC nejsou podporovány.

  • Čisté Netmodules nejsou podporovány jako vstup do propojovacího programu jazyka Visual C++. Nicméně čisté soubory .obj jsou podporovány propojovacím programem a .obj soubory obsahují nadřazené infomace obsažené v netmodules. Další informace naleznete v tématu .netmodule Files as Linker Input.

  • Podpora kompilátoru modelu COM (#import) není podporována, protože by to mohlo zavést nespravované instrukce do čistého sestavení.

  • Zarovnání a zpracování výjimek pro číslo s plovoucí desetinnou nejsou upravitelné pro čistá sestavení. Ve výsledku nelze použít __declspec(align). To činí některé hlavičkové soubory, jako je například fpieee.h, nekompatibilní s /clr:pure.

  • Funkce GetLastError v PSDK může poskytnout nedefinované chování při kompilaci s /clr:pure.

Ověřitelné (/clr:safe)

Možnost kompilátoru /clr:safe generuje ověřitelná sestavení, stejná jako když jsou napsána v aplikaci Visual Basic a C#, vyhovující požadavkům umožňující modulu CLR zaručit to, že kód neporušuje běžná bezpečnostní nastavení. Například pokud bezpečnostní nastavení zakazují komponentě zápis na disk, modul CLR může určit zda ověřitelná komponenta splňuje toto kritérium před provedením jakéhokoliv kódu. Není k dispozici podpora modulu CRT pro ověřitelná sestavení. (podpora modulu CRT je k dispozici čistým sestavením skrz verzi modulu CRT pro čistý jazyk MSIL.)

Ověřitelná sestavení nabízejí tyto výhody oproti čistým a smíšeným sestavením:

  • Zvýšená bezpečnost.

  • Některé situace ji vyžadují (například SQL komponenty).

  • Budoucí verze systému Windows budou stále více požadovat ověřené komponenty a aplikace.

Jedenou nevýhodou je to, že nejsou k dispozici funkce interop jazyka C++. Ověřitelná sestavení nemohou obsahovat žádné nespravované funkce nebo nativní datové typy i když neodkazují na spravovaný kód.

Navzdory použití slovo "safe", neznamená kompilace aplikace s /clr:safe, že zde nejsou žádné chyby; znamená to pouze to, že modul CLR může za běhu ověřit bezpečnostní nastavení.

Bez ohledu na typ sestavení, bude přeloženo volání ze spravovaných sestavení do nativních knihoven DLL prostřednictvím P/Invoke, může ale dojít k selhání při běhu v závislosti na bezpečnostním nastavení.

Poznámka

Existuje jedna situace, která projde překladačem, ale ve výsledku to pak bude neověřitelné sestavení: volání virtuální funkce pomocí instance objektu za použití operátoru rozsahu rozlišení. Příklad: MyObj -> A::VirtualFunction();.

Viz také

Další zdroje

Průvodce programováním .NET