/clr
Ograniczenia
Zwróć uwagę na następujące ograniczenia dotyczące korzystania z programu /clr
:
W programie obsługi wyjątków ustrukturyzowanych istnieją ograniczenia dotyczące używania
_alloca
podczas kompilowania za pomocą/clr
polecenia . Aby uzyskać więcej informacji, zobacz_alloca
.Użycie sprawdzania błędów w czasie wykonywania nie jest prawidłowe w przypadku
/clr
polecenia . Aby uzyskać więcej informacji, zobacz How to: Use native run-time checks (Instrukcje: używanie natywnych testów w czasie wykonywania).Gdy
/clr
program jest używany do kompilowania programu, który używa tylko standardowej składni języka C++, następujące wytyczne dotyczą korzystania z wbudowanego zestawu:Wbudowany kod zestawu, który zakłada, że znajomość układu stosu natywnego, wywoływanie konwencji poza bieżącą funkcją lub inne informacje niskiego poziomu dotyczące komputera mogą zakończyć się niepowodzeniem, jeśli ta wiedza jest stosowana do ramki stosu dla funkcji zarządzanej. Funkcje zawierające wbudowany kod zestawu są generowane jako funkcje niezarządzane, tak jakby zostały umieszczone w osobnym module, który został skompilowany bez
/clr
elementu .Wbudowany kod zestawu w funkcjach, które przekazują parametry funkcji skonstruowanych w trybie kopiowania, nie jest obsługiwany.
vprintf
Nie można wywołać funkcji z programu skompilowanego za pomocą/clr
polecenia .Modyfikator
naked
__declspec
jest ignorowany w obszarze/clr
.Funkcja translator ustawiona przez
_set_se_translator
będzie mieć wpływ tylko na przechwyt w kodzie niezarządzanych. Aby uzyskać więcej informacji, zobacz Obsługa wyjątków.Porównanie wskaźników funkcji nie jest dozwolone w obszarze
/clr
.Korzystanie z funkcji, które nie są w pełni prototypowane, nie jest dozwolone w obszarze
/clr
.Następujące opcje kompilatora nie są obsługiwane w programie
/clr
:/EHsc
and/EHs
(/clr
implikuje/EHa
(patrz/EH
(model obsługi wyjątków))/fp:strict
i/fp:except
(zobacz/fp
(Określ zachowanie zmiennoprzecinkowe))
Kombinacja
_STATIC_CPPLIB
definicji preprocesora (/D_STATIC_CPPLIB
) i/clr
opcji kompilatora nie jest obsługiwana. Jest to spowodowane tym, że definicja spowoduje, że aplikacja będzie łączyć się ze statyczną, wielowątkową standardową biblioteką C++, która nie jest obsługiwana. Aby uzyskać więcej informacji, zobacz/MD
,/LD
/MT
( Użyj biblioteki czasu wykonywania).W przypadku używania z
/clr
programem/Zi
istnieją konsekwencje dla wydajności. Aby uzyskać więcej informacji, zobacz/Zi
.Przekazywanie szerokiego znaku do procedury wyjściowej programu .NET Framework bez określania lub bez rzutowania
/Zc:wchar_t
znaku w taki_wchar_t
sposób spowoduje, że dane wyjściowe będą wyświetlane jakounsigned short int
. Na przykład:Console::WriteLine(L' ') // Will output 32. Console::WriteLine((__wchar_t)L' ') // Will output a space.
/GS
Polecenie jest ignorowane podczas kompilowania z elementem/clr
, chyba że funkcja jest w obszarze#pragma unmanaged
lub jeśli funkcja musi być skompilowana jako kod natywny, w tym przypadku kompilator wygeneruje ostrzeżenie C4793, które jest domyślnie wyłączone.Zobacz
/ENTRY
wymagania dotyczące podpisu funkcji aplikacji zarządzanej.Aplikacje skompilowane za pomocą
/openmp
polecenia i/clr
mogą być uruchamiane tylko w jednym procesie domeny aplikacji. Aby uzyskać więcej informacji, zobacz/openmp
(Włączanie obsługi protokołu OpenMP 2.0).Funkcje, które przyjmują zmienną liczbę argumentów (varargs), zostaną wygenerowane jako funkcje natywne. Wszystkie zarządzane typy danych w pozycji argumentu zmiennej będą marshalowane do typów natywnych. Wszystkie System.String typy są w rzeczywistości ciągami o szerokim znaku, ale są one marshalowane do ciągów znaków jednobajtowych. Dlatego jeśli
printf
specyfikator to%S
(wchar_t*
), zamiast tego będzie on marshalingiem%s
do ciągu.Podczas korzystania z makra
va_arg
podczas kompilowania/clr:pure
za pomocą polecenia można uzyskać nieoczekiwane wyniki. Aby uzyskać więcej informacji, zobacz , ,va_end
va_copy
,va_start
.va_arg
Opcje/clr:pure
i/clr:safe
kompilatora są przestarzałe w programie Visual Studio 2015 i nieobsługiwane w programie Visual Studio 2017 lub nowszym. Kod, który musi być "czysty" lub "bezpieczny", powinien być przekierowywany do języka C#.Nie należy wywoływać żadnych funkcji, które przeprowadzą stos, aby uzyskać informacje o parametrach (argumenty funkcji) z kodu zarządzanego. Warstwa P/Invoke powoduje, że informacje są dalej w stosie. Na przykład nie kompiluj serwera proxy/wycinku za pomocą polecenia
/clr
.Funkcje zostaną skompilowane do kodu zarządzanego zawsze, gdy jest to możliwe, ale nie wszystkie konstrukcje języka C++ można przetłumaczyć na zarządzany kod. To określenie jest wykonywane na podstawie funkcji po funkcji. Jeśli nie można przekonwertować żadnej części funkcji na kod zarządzany, zamiast tego cała funkcja zostanie przekonwertowana na kod natywny. Następujące przypadki uniemożliwiają kompilatorowi generowanie kodu zarządzanego.
Generowane przez kompilator funkcje thunks lub pomocnika. Natywne thunks są generowane dla dowolnego wywołania funkcji za pośrednictwem wskaźnika funkcji, w tym wywołań funkcji wirtualnych.
Funkcje wywołujące
setjmp
lublongjmp
.Funkcje, które używają pewnych procedur wewnętrznych do bezpośredniego manipulowania zasobami maszyny. Na przykład użycie funkcji
__enable
i__disable
_ReturnAddress
i_AddressOfReturnAddress
lub elementów wewnętrznych multimediów spowoduje, że kod natywny będzie w kodzie natywnym.Funkcje zgodne z dyrektywą
#pragma unmanaged
. (Odwrotność,#pragma managed
, jest również obsługiwana).Funkcja zawierająca odwołania do wyrównanych typów, czyli typów zadeklarowanych przy użyciu polecenia
__declspec(align(...))
.