/clr (компиляция CLR)
Обновлен: Ноябрь 2007
Позволяет приложениям и компонентам использовать функции среды CLR.
/clr[:options]
Аргументы
options
Один или несколько из следующих параметров, разделенных запятыми./clr
Создает метаданные приложения, которые могут потребляться другими приложениями CLR, и позволяет приложению потреблять типы и данные в метаданных других компонентов CLR.Дополнительные сведения см. в следующих разделах:
/clr:pure
Создает выходной файл только на языке MSIL без машинного исполняемого кода, хотя и содержащий собственные типы, скомпилированные в MSIL.Дополнительные сведения см. в разделе Чистый и проверяемый код.
/clr:safe
Создает проверяемый выходной файл только на языке MSIL (без исполняемого машинного кода). /clr:safe включает диагностику файла (Средство PEVerify (Peverify.exe)).Дополнительные сведения см. в разделе Написание проверяемого строго типизированного кода.
/clr:oldSyntax
Позволяет использовать синтаксис управляемых расширений для C++, оригинальный синтаксис Visual C++ для программирования в среде CLR.Примечание. Синтаксис управляемых расширений для C++ не рекомендуется использовать в Microsoft Visual C++ 2005. Следует использовать /clr:oldSyntax, только для приложений Visual C++, которые поддерживают управляемые расширения для C++. При разработке нового приложения следует использовать обновленный синтаксис. Дополнительные сведения см. в разделе Language Features for Targeting the CLR.
Если приложение поддерживает управляемые расширения для C++, можно адаптировать проект к новому синтаксису. Дополнительные сведения см. в разделе Перенос и обновление программ.
/clr:noAssembly
Параметр noAssembly указывает, что манифест сборки не нужно включать в выходной файл. По умолчанию параметр noAssembly не используется.Примечание. Параметр noAssembly не рекомендуется использовать в Visual C++ 2005. Вместо него следует использовать ключевое слово /LN (создание модуля MSIL). Дополнительные сведения см. в разделе Нерекомендуемые параметры компилятора в Visual C++ 2005.
Управляемая программа, которая не содержит метаданных сборки в манифесте, называется модулем. Параметр noAssembly можно использовать только для создания модуля. Если компиляция выполняется с параметрами Параметр /c (компиляция без связывания) и /clr:noAssembly, то на стадии компоновки следует указать параметр /NOASSEMBLY (создать модуль MSIL) для создания модуля.
До Visual C++ 2005 вместо /clr использовалось /clr:noAssembly. Однако в настоящее время /clr поддерживает /clr:oldSyntax, поэтому при задании /clr:noAssembly необходимо указать форму /clr. Например, /clr:noAssembly /clr создает модуль с помощью нового синтаксиса CLR Visual C++ и /clr:noAssembly,oldSyntax создает модуль с помощью управляемых расширений для C++.
До Visual C++ 2005 для /clr:noAssembly требовался параметр /LD. Теперь при указании /clr:noAssembly параметр /LD подразумевается по умолчанию.
/clr:initialAppDomain
Позволяет приложению Visual C++ выполняться в среде CLR версии 1. При использовании initialAppDomain можно столкнуться с некоторыми проблемами, описанными в статье Q309694 базы знаний Майкрософт. Статьи базы знаний Майкрософт доступны на носителях библиотеки MSDN или по адресу https://support.microsoft.com//.Приложение, скомпилированное с помощью параметра initialAppDomain, не должно использоваться приложением, использующим ASP.NET. Следует обновить среду выполнения, чтобы работать с функциями ASP.NET на С++.
Заметки
Управляемый код — это код, который можно проверять и управлять с помощью среды CLR. С помощью управляемого кода можно обращаться к управляемым объектам.
См. также раздел Ограничения /clr.
Сведения о разработке приложений, в которых определяются и потребляются управляемые типы, см. в разделе Language Features for Targeting the CLR.
Приложение, скомпилированное с помощью параметра /clr, может как содержать, так и не содержать управляемые данные.
Способы включения отладки для управляемых приложений см. в разделе /ASSEMBLYDEBUG (добавление атрибута DebuggableAttribute).
В куче, в которой выполняется сборка мусора, создаются экземпляры только типов CLR. Дополнительные сведения см. в разделе Classes and Structs (Managed). Чтобы выполнить компиляцию функции в машинный код, следует использовать прагму unmanaged. Дополнительные сведения см. в описании managed, unmanaged.
По умолчанию параметр /clr не действует. Если параметр /clr используется, также используется и параметр /MD (дополнительные сведения см. в описании /MD). Параметр /MD обеспечивает выбор из стандартных файлов заголовков (H) динамически-скомпонованных, многопоточных версий программ среды выполнения. Многопоточность необходима для программирования с использованием управляемого кода, поскольку сборщик мусора CLR запускает методы завершения в вспомогательном потоке.
При выполнении компиляции с помощью параметра /c можно указать тип CLR (IJW, safe или pure) для выходного файла, задав параметр /CLRIMAGETYPE (указание типа образа среды CLR).
Параметр /clr подразумевает использование /EHa, поэтому никакой другой параметр /EH не может использоваться с /clr. Дополнительные сведения см. в разделе Параметр /EH (модель обработки исключений).
Дополнительные сведения об определении типа образа среды CLR файла см. в разделе /CLRHEADER.
Все модули, переданные компоновщику при вызове, должны быть скомпилированы с помощью одних и тех же параметров компилятора библиотеки среды выполнения (/MD или /LD).
Чтобы внедрить ресурс в сборку, следует использовать параметр компоновщика /ASSEMBLYRESOURCE (внедрение управляемого ресурса). Параметры компоновщика /DELAYSIGN (частичное подписание сборки), /KEYCONTAINER (задание контейнера ключей для подписи сборки) и /KEYFILE (задание ключа или пары ключей для подписи сборки) также позволяют определять способы создания сборки.
Если используется параметр /clr, символ _MANAGED определяется как "1". Дополнительные сведения см. в разделе Predefined Macros.
Глобальные переменные в файлах неуправляемых объектов инициализируются в первую очередь (во время выполнения DllMain, если исполняемым файлом является DLL), затем инициализируются глобальные переменные в разделе управляемого кода (до его запуска). #pragmainit_seg влияет только на порядок инициализации внутри управляемых и неуправляемых категорий.
Компиляция с помощью параметра /clr:safe аналогична компиляции с помощью /platform:anycpu в языках, таких как C#.
Безопасные и чистые образы
Безопасный образ использует версию CLR библиотеки CRT. Однако библиотека CRT является непроверяемой, поэтому ее нельзя использовать при компиляции с помощью параметра /clr:safe. Дополнительные сведения см. в разделе C Run-Time Libraries.
К примерам машинного кода, который не используется в чистом образе, относится встроенный ассемблерный код, setjmp и longjmp.
Каждая точка входа чистого и безопасного образа является управляемой. При компиляции с помощью параметра /clr точка входа является неуправляемой. Дополнительные сведения см. в разделе __clrcall.
При компиляции с помощью параметра /clr:safe переменные по умолчанию являются appdomain и не могут существовать отдельно для каждого процесса. При использовании параметра /clr:pureappdomain является значением по умолчанию, однако можно использовать и переменные process.
При запуске 32-разрядного исполняемого файла, скомпилированного с помощью /clr или /clr:pure на компьютере с 64-разрядной операционной системой, приложение будет выполняться в режиме WOW64, который позволяет 32-разрядной среде CLR запускать 32-разрядные приложения на 64-разрядной операционной системе. По умолчанию исполняемый файл, скомпилированный с использованием параметра /clr:safe, запускается в 64-разрядной среде CLR на компьютере с установленной 64-разрядной операционной системой (на компьютере с 32-разрядной операционной системой тот же исполняемый файл запускается в 32-разрядной среде CLR). В то же время безопасное приложение может загрузить 32-битный компонент. В этом случае в безопасном образе, выполняющемся на компьютере с поддержкой 64-разрядной операционной системы, произойдет сбой при загрузке 32-разрядного приложения. Чтобы убедиться, что безопасный образ продолжает выполняться при загрузке 32-разрядного образа на компьютер с 64-разрядной операционной системой, следует использовать /CLRIMAGETYPE (указание типа образа среды CLR) для изменения метаданных (CORFLAG) таким образом, чтобы приложение выполнялось в режиме WOW64. Ниже приведен образец командной строки (следует использовать свой собственный символ ввода).
cl /clr:safe t.cpp /link /clrimagetype:pure /entry:?main@@$$HYMHXZ /subsystem:console
Сведения о получении внутреннего имени см. в разделе Использование списка для просмотра декорированных имен. Дополнительные сведения о 64-разрядном программировании см. в разделе 64-bit Programming (How Do I in Visual C++).
Примеры, пошаговые руководства и подробные сведения см. в следующих разделах:
Метаданные и неименованные классы
Неименованные классы используются в метаданных со следующими именами: $UnnamedClass$crc-текущего-имени-файла$index$, где index является номером неименованного класса в компиляции. Например, в следующем примере кода создается неименованный класс в метаданных.
// clr_unnamed_class.cpp
// compile with: /clr /LD
class {} x;
Чтобы просмотреть метаданные, следует использовать Ildasm.exe.
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Открытие свойств страниц проекта.
Выберите папку Свойства конфигурации.
Выберите страницу свойств Общие.
Измените свойство Поддержка среды CLR.
Cведения о создании модулей см. в разделе /NOASSEMBLY (создать модуль MSIL).
Примечание. Если в диалоговом окне Страницы свойств проекта включен параметр /clr, свойства параметров компилятора, несовместимые с /clr, также будут настроены. Например, если используется параметр /RTC, а затем включается /clr, то параметр /RTC будет отключен.
Аналогичным образом при отладке приложения, созданного с помощью /clr, свойство Тип отладчика должно быть установлено в значение Смешанный или Только управляемый код. Дополнительные сведения см. в разделе Параметры проекта для конфигурации отладки C++.
Установка данного параметра компилятора программным способом
- См. раздел CompileAsManaged.