/clr
Omezení
Všimněte si následujících omezení použití /clr
:
V obslužné rutině strukturované výjimky existují omezení použití
_alloca
při kompilaci s/clr
. Další informace najdete na webu_alloca
.Použití kontrol chyb za běhu není platné u
/clr
. Další informace naleznete v tématu Postupy: Použití nativních kontrol za běhu.Pokud
/clr
se používá ke kompilaci programu, který používá pouze standardní syntaxi jazyka C++, platí následující pokyny pro použití vloženého sestavení:Vložený kód sestavení, který předpokládá znalost nativního rozložení zásobníku, volání konvencí mimo aktuální funkci nebo jiné informace na nízké úrovni počítače mohou selhat, pokud je tato znalost použita na rámec zásobníku pro spravovanou funkci. Funkce obsahující vložený kód sestavení jsou generovány jako nespravované funkce, jako by byly umístěny do samostatného modulu, který byl zkompilován bez
/clr
.Vložený kód sestavení ve funkcích, které předávají parametry funkce vytvořené kopírováním, není podporováno.
Funkce
vprintf
nelze volat z programu zkompilovaného pomocí/clr
.Modifikátor
naked
__declspec
je ignorován v části/clr
.Funkce translator nastavená podle
_set_se_translator
bude mít vliv pouze na zachytává v nespravovaném kódu. Další informace najdete v tématu Zpracování výjimek.Porovnání ukazatelů na funkce není povoleno v části
/clr
.Použití funkcí, které nejsou plně prototypované, není povoleno v části
/clr
.Následující možnosti kompilátoru nejsou podporovány:
/clr
/EHsc
a/EHs
(/clr
implikuje/EHa
(viz (model/EH
zpracování výjimek))/fp:strict
a/fp:except
(viz/fp
(určení chování s plovoucí desetinou čárkou))
Kombinace definice preprocesoru
_STATIC_CPPLIB
(/D_STATIC_CPPLIB
) a možnosti kompilátoru/clr
se nepodporují. Je to proto, že definice by vaší aplikaci způsobila propojení se statickou vícevláknovou standardní knihovnou C++, která není podporovaná. Další informace naleznete v tématu/MD
,/MT
,/LD
(použití run-time library).Pokud používáte s
/Zi
/clr
, mají to vliv na výkon. Další informace najdete na webu/Zi
.Předání širokého znaku do výstupní rutiny rozhraní .NET Framework bez zadání
/Zc:wchar_t
nebo bez přetypování znak_wchar_t
způsobí, že se výstup zobrazí jakounsigned short int
. Příklad:Console::WriteLine(L' ') // Will output 32. Console::WriteLine((__wchar_t)L' ') // Will output a space.
/GS
při kompilaci pomocí/clr
funkce , pokud není funkce pod#pragma unmanaged
nebo pokud je funkce musí být zkompilována jako nativní kód, v takovém případě kompilátor vygeneruje upozornění C4793, což je ve výchozím nastavení vypnuté.Viz
/ENTRY
požadavky na podpis funkce spravované aplikace.Aplikace kompilované pomocí
/openmp
a/clr
lze je spouštět pouze v jednom procesu domény aplikace. Další informace najdete v tématu/openmp
(Povolení podpory OpenMP 2.0).Funkce, které přebírají proměnný počet argumentů (varargs), se vygenerují jako nativní funkce. Všechny spravované datové typy v pozici argumentu proměnné budou zařazovány do nativních typů. Všechny System.String typy jsou ve skutečnosti řetězce širokého znaku, ale zařazuje se na řetězce znaků s jedním bajtem. Takže pokud
printf
je%S
specifikátor (wchar_t*
), zařadí se do%s
řetězce.Při použití
va_arg
makra může dojít k neočekávaným výsledkům při kompilaci pomocí/clr:pure
. Další informace naleznete v tématuva_arg
,va_copy
,va_end
,va_start
. Možnosti kompilátoru/clr:pure
jsou/clr:safe
zastaralé v sadě Visual Studio 2015 a nejsou podporované v sadě Visual Studio 2017 a novější. Kód, který musí být "čistý" nebo "bezpečný", by se měl přenést do C#.Neměli byste volat žádné funkce, které provedou zásobník, abyste získali informace o parametrech (argumenty funkce) ze spravovaného kódu. Vrstva volání nespravovaného kódu způsobí, že informace budou dál v zásobníku. Například nekompilujte proxy/zástupný kód s příponou
/clr
.Funkce budou zkompilovány do spravovaného kódu, kdykoli je to možné, ale ne všechny konstruktory jazyka C++, lze je přeložit do spravovaného kódu. Toto určení se provádí na základě funkce. Pokud některou část funkce nejde převést na spravovaný kód, celá funkce se místo toho převede na nativní kód. Následující případy brání kompilátoru v generování spravovaného kódu.
Vygenerované bloky dat kompilátoru nebo pomocné funkce. Nativní převody dat se generují pro jakékoli volání funkce prostřednictvím ukazatele funkce, včetně volání virtuálních funkcí.
Funkce, které volají
setjmp
nebolongjmp
.Funkce, které používají určité vnitřní rutiny k přímé manipulaci s prostředky počítače. Například použití
__enable
a a__disable
_ReturnAddress
, a , nebo_AddressOfReturnAddress
multimediální vnitřní objekty budou mít za následek nativní kód.Funkce, které dodržují direktivu
#pragma unmanaged
. (Inverzní funkce#pragma managed
, podporuje se také.)Funkce, která obsahuje odkazy na zarovnané typy, to znamená typy deklarované pomocí
__declspec(align(...))
.