Share via


/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

  • 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í jako unsigned short int. Příklad:

    Console::WriteLine(L' ')              // Will output 32.
    Console::WriteLine((__wchar_t)L' ')   // Will output a space.
    
  • /GS při kompilaci pomocí /clrfunkce , 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ématu va_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 nebo longjmp.

    • 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 _AddressOfReturnAddressmultimediá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(...)).

Viz také