Поделиться через


/clr Ограничения

Обратите внимание на следующие ограничения использования /clr:

  • В структурированном обработчике исключений существуют ограничения на использование _alloca при компиляции./clr Дополнительные сведения см. в разделе _alloca.

  • Использование проверок ошибок во время выполнения недопустимо./clr Дополнительные сведения см. в разделе "Практическое руководство. Использование собственных проверок во время выполнения".

  • Если /clr используется для компиляции программы, которая использует только стандартный синтаксис C++, следующие рекомендации применяются к использованию встроенной сборки:

    • Встроенный код сборки, который предполагает наличие знаний о макете собственного стека, соглашениях о вызовах за пределами текущей функции или других подробных сведений о компьютере, может завершиться ошибкой, если эта информация применяется к кадру стека для управляемой функции. Функции, содержащие встроенный код сборки, создаются как неуправляемые функции, как если бы они были помещены в отдельный модуль, скомпилированный без /clr.

    • Встроенный код сборки в функциях, которые передают параметры функции, созданные копией, не поддерживаются.

  • Функции vprintf не могут вызываться из программы, скомпилированной с /clrпомощью .

  • Модификатор naked __declspec игнорируется в /clrразделе .

  • Функция переводчика, заданная путем, _set_se_translator влияет только на перехваты в неуправляемом коде. Дополнительные сведения см. в разделе "Обработка исключений".

  • Сравнение указателей функций не допускается./clr

  • Использование функций, которые не полностью прототипируются, не разрешено./clr

  • Следующие параметры компилятора не поддерживаются в /clrследующих случаях:

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

См. также