/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

  1. Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Открытие свойств страниц проекта.

  2. Выберите папку Свойства конфигурации.

  3. Выберите страницу свойств Общие.

  4. Измените свойство Поддержка среды CLR.

    Cведения о создании модулей см. в разделе /NOASSEMBLY (создать модуль MSIL).

    k8d11d4s.alert_note(ru-ru,VS.90).gifПримечание.

    Если в диалоговом окне Страницы свойств проекта включен параметр /clr, свойства параметров компилятора, несовместимые с /clr, также будут настроены. Например, если используется параметр /RTC, а затем включается /clr, то параметр /RTC будет отключен.

    Аналогичным образом при отладке приложения, созданного с помощью /clr, свойство Тип отладчика должно быть установлено в значение Смешанный или Только управляемый код. Дополнительные сведения см. в разделе Параметры проекта для конфигурации отладки C++.

Установка данного параметра компилятора программным способом

См. также

Ссылки

Параметры компилятора

Настройка параметров компилятора