Ограничения /clr
Обновлен: Ноябрь 2007
Обратите внимание на следующие ограничения по применению параметра /clr:
В обработчиках структурированных исключений налагаются ограничения на использование функции _alloca при компиляции с параметром /clr. Дополнительные сведения см. в разделе _alloca.
Использование проверок ошибок во время выполнения при использовании параметра /clr не допускается. Дополнительные сведения см. в разделе Проверки ошибок во время выполнения.
Когда параметр /clr используется для компиляции программы, использующей только стандартный синтаксис C++, на использование встроенных операторов языка ассемблера налагаются следующие ограничения:
Встроенный код на языке ассемблера, полагающийся на определенные правила организации стека, соглашения о вызове за пределами текущей функции или другую низкоуровневую информацию о компьютере, может привести к сбою, если эта информация применяется для работы с фреймом стека управляемой функции. Функции, содержащие встроенный код на языке ассемблера, генерируются как неуправляемые, как если бы они размещались в отдельном модуле, компилируемом без использования параметра /clr.
Встроенный код на языке ассемблера нельзя использовать в функциях, принимающих параметры, передаваемые с помощью конструкторов копирования.
Функции vprintf нельзя вызывать из программы, скомпилированной с параметром /clr.
Модификатор __declspec naked игнорируется при использовании параметра /clr.
Функция-преобразователь, заданная с помощью функции _set_se_translator, будет использоваться только в перехватчиках исключений в неуправляемом коде. Дополнительные сведения см. в разделе Exception Handling under /clr.
При использовании параметра /clr не допускается сравнение указателей на функции.
При использовании параметра /clr не допускается использование функций, не имеющих полных прототипов.
Следующие параметры компилятора нельзя использовать вместе с параметром /clr:
/EHsc и /EHs (параметр /clr неявно предполагает параметр /EHa (см. раздел Параметр /EH (модель обработки исключений));
/fp:strict и /fp:except (см. раздел /fp (Определение поведения с плавающей запятой));
/Zd;
/Gm;
/MT;
/RTC;
/ZI
Сочетание определения препроцессора _STATIC_CPPLIB (/D_STATIC_CPPLIB) и параметра компилятора /clr или /clr:pure не поддерживается. Причина в том, что определение приводит к компоновке приложения со статической многопотоковой стандартной библиотекой C++; такое поведение не поддерживается. Дополнительные сведения см. в разделе /MD, /MT, /LD (использование библиотеки времени выполнения).
Параметр /J нельзя использовать вместе с параметром /clr:safe или /clr:pure.
В Visual C++ 2005 библиотеки ATL и MFC не поддерживаются при компиляции в режиме чистого промежуточного языка (/clr:pure). Параметр /clr:pure можно использовать со стандартной библиотекой C++ и библиотекой времени выполнения C, если одновременно используется параметр /MD или /MDd.
При использовании параметра /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 #pragma unmanaged или же не компилируется в машинном коде; в последнем случае компилятор выдает предупреждение C4793, которое по умолчанию отключено.
Дополнительные сведения о требованиях, предъявляемых к сигнатурам функций в управляемых приложениях, см. в разделе /ENTRY.
Приложения, компилируемые с параметрами /openmp и /clr, могут выполняться только в процессе с одним доменом приложения. Дополнительные сведения см. в разделе /openmp (включение поддержки OpenMP 2.0).
Функции, принимающие переменное число аргументов (varargs), будут компилироваться в машинном коде. Любые управляемые типы данных, используемые в качестве дополнительных аргументов, будут маршалироваться в неуправляемые типы. Обратите внимание, что типы System.String в действительности являются многобайтовыми строками, но они маршалируются в строки однобайтовых знаков. Соответственно, если в функции printf используется спецификатор "%S" (тип wchar_t*), то он будет упакован в строку "%s".
Если при компиляции с параметром /clr:pure используется макрос va_arg, результаты его использования могут быть непредвиденными. Дополнительные сведения см. в разделе va_arg, va_end, va_start.
Из управляемого кода не следует вызывать любые функции, проходящие по стеку для получения сведений о параметрах (аргументов функций); уровень P/Invoke переводит эти сведения ниже по стеку. Например, с параметром /clr не следует компилировать прокси и заглушки.
Функции по возможности компилируются в управляемом коде, но не все конструкции C++ можно преобразовать в управляемый код. Возможность преобразования определяется отдельно для каждой функции. Если часть функции нельзя преобразовать в управляемый код, то вся функция будет скомпилирована в машинном коде. Компилятор не генерирует управляемый код в следующих случаях.
Генерируемые компилятором преобразователи и вспомогательные функции. Преобразователи в машинном коде генерируются для всех вызовов функций через указатель на функцию, в том числе и для вызовов виртуальных функций;
Функции, вызывающие команду setjmp или longjmp;
Функции, использующие определенные встроенные процедуры для прямого взаимодействия с аппаратными ресурсами. К примеру, использование встроенных процедур __enable и __disable, _ReturnAddress и _AddressOfReturnAddress или мультимедийных встроенных процедур приведет к компиляции в машинном коде;
Функции, следующие директиве #pragma unmanaged. (обратите внимание, что также поддерживается обратная директива, #pragma managed);
Функции, содержащие ссылки на выравниваемые типы, то есть типы, объявленные с помощью модификатора __declspec(align(...)).
Классы Compiler COM Support нельзя использовать с параметром /clr:pure или /clr:safe.