Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обратите внимание на следующие ограничения использования /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могут выполняться только в одном процессе доменов приложений. Дополнительные сведения см. в разделе (Включение поддержки/openmpOpenMP 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(...)).