Čistý a ověřitelný kód (C++/CLI)
Pro programování v rozhraní .NET aplikace Visual C++ podporuje vytváření tří různý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)
Poznámky
Další informace o ověřitelném sestavení naleznete v tématu:
Postupy: Vytvoření ověřitelných projektů jazyka C++ (C++/CLI)
Použití ověřitelných sestavení se serverem SQL Server (C++/CLI)
Převod projektů ze smíšeného režimu do čistého IL (Intermediate Language)
Smíšené (/clr)
Smíšené sestavení (kompilované s /clr), obsahuje obě nespravované a spravované části, což jim umožňuje použití 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í funkce 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 volání 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: Jelikož čistá sestavení obsahují pouze jazyk MSIL, neobsahuje žádné nativní funkce, a proto není zapotřebí žádných přechodů mezi spravovaným a nespravovaným kódem. (Z tohoto pravidla je volání funkce prostřednictvím P/Invoke výjimkou).
Sledování domény aplikace: Spravované funkce a datové typy CLR existují uvnitř domén aplikací (Application Domains), což ovlivňuje jejich viditelnost a přístupnost.Čistá sestavení rozpoznávají domény (__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 spolupracují čistá sestavení snadněji s dalšími komponentami rozhraní .NET než smíšená sestavení.
Načítání mimo disk: Čistá sestavení lze načít uvnitř paměti a lze jej dokonce vysílat datovým proudem.To je nezbytně nutné pro použití sestavení rozhraní .NET jako uložených procedur.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: Nelze provádět reflexi pro smíšené spustitelné soubory, zatímco čistá sestavení poskytují plnou podporu reflexe.Další informace naleznete v tématu Reflexe (C++/CLI).
Ovladatelnost hostitele: Jelikož čistá sestavení obsahují pouze jazyk MSIL, chovají se při použití v aplikacích, které jsou hostiteli pro modul CLR a upravují jeho výchozí chování, předvídatelněji a flexibilněji než smíšená sestavení.
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řechod na /clr:pure (C++/CLI).
Režim čisté kompilace nepodporuje v jazyce Visual C++ knihovny ATL a MFC.
Čisté moduly .netmodule nejsou podporovány jako vstup do linkeru jazyka Visual C++.Nicméně čisté soubory .obj jsou podporovány propojovacím programem a .obj soubory obsahují nadřazené informace obsažené v netmodules.Další informace naleznete v tématu Soubory .netmodule jako vstup linkeru.
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 kódování, která bude úspěšně zkompilována, ale povede k neověřitelnému sestavení: volání virtuální funkce instancí objektu pomocí operátoru vyhodnocení oboru. Například: MyObj -> A::VirtualFunction();.