/clr
Ограничения
Обратите внимание на следующие ограничения использования /clr
:
В структурированном обработчике исключений существуют ограничения на использование
_alloca
при компиляции./clr
Дополнительные сведения см. в разделе_alloca
.Использование проверок ошибок во время выполнения недопустимо.
/clr
Дополнительные сведения см. в разделе "Практическое руководство. Использование собственных проверок во время выполнения".Если
/clr
используется для компиляции программы, которая использует только стандартный синтаксис C++, следующие рекомендации применяются к использованию встроенной сборки:Встроенный код сборки, который предполагает наличие знаний о макете собственного стека, соглашениях о вызовах за пределами текущей функции или других подробных сведений о компьютере, может завершиться ошибкой, если эта информация применяется к кадру стека для управляемой функции. Функции, содержащие встроенный код сборки, создаются как неуправляемые функции, как если бы они были помещены в отдельный модуль, скомпилированный без
/clr
.Встроенный код сборки в функциях, которые передают параметры функции, созданные копией, не поддерживаются.
Функции
vprintf
не могут вызываться из программы, скомпилированной с/clr
помощью .Модификатор
naked
__declspec
игнорируется в/clr
разделе .Функция переводчика, заданная путем,
_set_se_translator
влияет только на перехваты в неуправляемом коде. Дополнительные сведения см. в разделе "Обработка исключений".Сравнение указателей функций не допускается.
/clr
Использование функций, которые не полностью прототипируются, не разрешено.
/clr
Следующие параметры компилятора не поддерживаются в
/clr
следующих случаях:/EHsc
и/EHs
(/clr
подразумевает/EHa
(см/EH
. (модель обработки исключений))/fp:strict
и/fp:except
(см/fp
. раздел (Указание поведения с плавающей запятой))
_STATIC_CPPLIB
Сочетание определения препроцессора (/D_STATIC_CPPLIB
) и/clr
параметра компилятора не поддерживается. Это связано с тем, что определение приведет к связыванию приложения со статической многопоточной стандартной библиотекой C++, которая не поддерживается. Дополнительные сведения см. в разделе/MD
,/LD
/MT
(Использование библиотеки времени выполнения).При использовании
/Zi
с/clr
ним существуют последствия для производительности. Дополнительные сведения см. в разделе/Zi
.Передача широкого символа в подпрограмму вывода платформа .NET Framework без указания
/Zc:wchar_t
или без приведения символа, что_wchar_t
приведет к отображению выходных данных в видеunsigned short int
. Например:Console::WriteLine(L' ') // Will output 32. Console::WriteLine((__wchar_t)L' ') // Will output a space.
/GS
игнорируется при компиляции с/clr
помощью функции, если функция не находится#pragma unmanaged
или не должна быть скомпилирована как машинный код, в этом случае компилятор создаст предупреждение C4793, которое по умолчанию отключено.Сведения
/ENTRY
о требованиях к подписи функций управляемого приложения.Приложения, скомпилированные с помощью
/openmp
и/clr
могут выполняться только в одном процессе доменов приложений. Дополнительные сведения см. в разделе (Включение поддержки/openmp
OpenMP 2.0).Функции, которые принимают переменное число аргументов (varargs), будут создаваться как собственные функции. Все управляемые типы данных в позиции аргументов переменных будут маршалированы в собственные типы. Все System.String типы на самом деле являются строками расширенных символов, но они маршалируются в строки символов с одним байтом. Таким образом, если
printf
описатель имеет значение%S
(wchar_t*
), он будет маршалировать в%s
строку.При использовании
va_arg
макроса при компиляции/clr:pure
с помощью макроса могут возникнуть непредвиденные результаты. Дополнительные сведения см. в разделеva_arg
,va_copy
,va_end
.va_start
/clr:safe
Параметры/clr:pure
компилятора устарели в Visual Studio 2015 и не поддерживаются в Visual Studio 2017 и более поздних версиях. Код, который должен быть "чистым" или "безопасным", необходимо портировать на C#.Вы не должны вызывать какие-либо функции, которые ходят по стеку, чтобы получить сведения о параметрах (аргументах функции) из управляемого кода. Уровень P/Invoke приводит к тому, что сведения будут дальше вниз по стеку. Например, не компилируйте прокси-сервер или заглушку с
/clr
помощью .Функции компилируются в управляемый код, когда это возможно, но не все конструкции C++ можно преобразовать в управляемый код. Это определение производится по функциям. Если любая часть функции не может быть преобразована в управляемый код, вместо этого вся функция будет преобразована в машинный код. Следующие варианты мешают компилятору создать управляемый код.
Созданные компилятором преобразователи или вспомогательные функции. Собственные преобразователи создаются для всех вызовов функций через указатель функции, включая вызовы виртуальных функций.
Функции, которые вызывают
setjmp
илиlongjmp
.Функции, использующие определенные встроенные подпрограммы для управления ресурсами компьютера напрямую. Например, использование
__enable
и__disable
,_ReturnAddress
и_AddressOfReturnAddress
или встроенных функций мультимедиа приводит к машинному коду.Функции, которые следуют директиве
#pragma unmanaged
. (Обратная#pragma managed
, также поддерживается.)Функция, которая содержит ссылки на выровненные типы, то есть типы, объявленные с помощью
__declspec(align(...))
.