/clr (компиляция CLR)
Позволяет приложениям и компонентам использовать функции среды CLR.
/clr[:options]
Аргументы
options
Один или несколько из следующих параметров, разделенных запятыми./clr
Создает метаданные для приложения. Метаданные могут использоваться другими приложениями среды CLR, и позволяют приложению использовать типы и данные в метаданных других компонентов среды CLR.Дополнительные сведения см. в следующем разделе.
/clr:pure
Создает выходной файл только на языке MSIL, который не содержит машинного исполняемого кода. Тем не менее он может содержать собственные типы, скомпилированные в MSIL.Для получения дополнительной информации см. Чистый и проверяемый код (C++/CLI).
/clr:safe
Создает проверяемый выходной файл только на языке MSIL (без исполняемого машинного кода). /clr:safe включает проверочную диагностику (средство PEVerify (Peverify.exe)).Для получения дополнительной информации см. Writing Verifiably Type-Safe Code.
/clr:oldSyntax
Позволяет использовать синтаксис управляемых расширений для C++, который является оригинальным синтаксисом Visual C++ для программирования в среде CLR.Синтаксис управляемых расширений для C++ использовать не рекомендуется. /clr:oldSyntax следует использовать только для обслуживания приложений, в которых используются управляемые расширения для C++. При разработке нового приложения следует использовать обновленный синтаксис. Для получения дополнительной информации см. Расширения компонентов для платформ среды выполнения.
Если имеются управляемые расширения для приложения C++, можно обновить проект для использования нового синтаксиса. Для получения дополнительной информации см. Перенос и обновление программ.
/clr:noAssembly
Указывает, что манифест сборки не следует вставлять в файл вывода. По умолчанию параметр noAssembly не используется.Параметр noAssembly не рекомендуется к использованию. Взамен рекомендуется использовать /LN (создание модуля MSIL). Для получения дополнительной информации см. Deprecated Compiler Options.
Управляемая программа, которая не содержит метаданных сборки в манифесте, называется модулем. Параметр noAssembly можно использовать только для создания модуля. Если компиляция выполняется с параметрами /c и /clr:noAssembly, то на стадии компоновки следует указать параметр /NOASSEMBLY для создания модуля.
До Visual C++ 2005 параметр /clr:noAssembly подразумевал /clr. Однако теперь /clr также поддерживает /clr:oldSyntax, поэтому при задании /clr:noAssembly необходимо указать форму /clr. Например, /clr:noAssembly /clr создает модуль с помощью нового синтаксиса CLR Visual C++, а /clr:noAssembly,oldSyntax создает модуль с помощью управляемых расширений для C++.
До Visual C++ 2005 параметр /clr:noAssembly требовал параметра /LD. Параметр /LD теперь подразумевается при указании параметра /clr:noAssembly.
/clr:initialAppDomain
Позволяет запускать приложение Visual C++ в версии 1 среды CLR. При использовании initialAppDomain, возможно появление некоторых проблем, которые описаны в ОШИБКА: Исключение AppDomainUnloaded при использовании управляемых расширений для C++ компонентов Visual C. на веб-сайте поддержки Майкрософт.Не следует использовать приложение, которое скомпилировано с помощью initialAppDomain, в приложении, которое использует ASP.NET, так как он не поддерживается в версии 1 среды CLR.
/clr:nostdlib
Указывает компилятору игнорировать каталог \clr по умолчанию. Компилятор выдает ошибки при включении нескольких версий библиотеки DLL, например System.dll. Использование этого параметра позволяет указать конкретную платформу для использования во время компиляции.
Заметки
Управляемый код — это код, который можно проверять и управлять им с помощью среды CLR. С помощью управляемого кода можно обращаться к управляемым объектам. Для получения дополнительной информации см. Ограничения /clr.
Сведения о разработке приложений, в которых определяются и потребляются управляемые типы, см. в разделе Расширения компонентов для платформ среды выполнения.
Приложение, скомпилированное с помощью параметра /clr, может как содержать, так и не содержать управляемые данные.
Способы включения отладки для управляемых приложений см. в разделе /ASSEMBLYDEBUG (добавление атрибута DebuggableAttribute).
В куче, в которой выполняется сборка мусора, создаются экземпляры только типов CLR. Для получения дополнительной информации см. Классы и структуры (расширения компонентов C++). Чтобы выполнить компиляцию функции в машинный код, следует использовать прагму unmanaged. Для получения дополнительной информации см. managed, unmanaged.
По умолчанию параметр /clr не действует. Когда действует параметр /clr, действует также /MD. Для получения дополнительной информации см. /MD, /MT, /LD (использование библиотеки времени выполнения). /MD гарантирует, что из стандартных файлов заголовка (с расширением H) выбираются динамически связанные, многопотоковые версии процедур среды выполнения. Многопоточность необходима для программирования с использованием управляемого кода, поскольку сборщик мусора CLR запускает методы завершения во вспомогательном потоке.
При выполнении компиляции с помощью параметра /c можно указать тип CLR (IJW, safe или pure) для выходного файла, задав параметр /CLRIMAGETYPE.
Параметр /clr подразумевает /EHa, и никакие другие параметры /EH для /clr не поддерживаются. Для получения дополнительной информации см. Параметр /EH (модель обработки исключений).
Дополнительные сведения об определении типа образа среды CLR для файла см. в разделе /CLRHEADER.
Все модули, передаваемые компоновщику при конкретном вызове, должны компилироваться с одним и тем же параметром компилятора, указывающим библиотеку времени выполнения (/MD или /LD).
Чтобы внедрить ресурс в сборку, следует использовать параметр компоновщика /ASSEMBLYRESOURCE. Параметры компоновщика /DELAYSIGN, /KEYCONTAINER и /KEYFILE также позволяют настроить способ создания сборки.
При использовании параметра /clr символ _MANAGED определяется как 1. Для получения дополнительной информации см. Предустановленный макрос.
Глобальные переменные в файлах собственных объектов инициализируются первыми (во время выполнения DllMain, если исполняемый файл является DLL-библиотекой), а затем инициализируются глобальные переменные управляемого раздела (перед запуском любого управляемого кода). #pragma init_seg влияет только на порядок инициализации в управляемых и неуправляемых категориях.
Компиляция с помощью параметра /clr:safe аналогична компиляции с помощью /platform:anycpu в таких языках, как C#.
Безопасные и чистые образы
Безопасный образ использует версию CLR библиотеки времени выполнения C (CRT). Однако библиотека CRT является непроверяемой, поэтому ее нельзя использовать при компиляции с помощью параметра /clr:safe. Для получения дополнительной информации см. Функции библиотеки CRT.
К примерам машинного кода, который не используется в чистом образе, относится встроенный ассемблерный код, setjmp и longjmp.
Каждая точка входа чистого и безопасного образа является управляемой. При компиляции с помощью параметра /clr точка входа является неуправляемой. Для получения дополнительной информации см. __clrcall.
При компиляции с помощью параметра /clr:safe переменными по умолчанию задаются для домена приложения, и их нельзя задать каждого процесса отдельно. Для /clr:pure, хотя значением по умолчанию является appdomain, можно использовать переменные процесса.
При запуске 32-разрядного исполняемого файла, скомпилированного с помощью /clr или /clr:pure на компьютере с 64-разрядной операционной системой, приложение будет выполняться в режиме WOW64, который позволяет 32-разрядной среде CLR запускать 32-разрядные приложения в 64-разрядной операционной системе. По умолчанию EXE-файл, скомпилированный с использованием параметра /clr:safe, запускается в 64-разрядной среде CLR на компьютере, работающем под управлением 64-разрядной операционной системы. (В 32-разрядной операционной системе один и тот же файл EXE-файл будет выполняться в 32-разрядной среде CLR.) Тем не менее безопасное приложение может загрузить 32-разрядный компонент. В этом случае в безопасном образе, выполняющемся на компьютере с поддержкой 64-разрядной операционной системы, произойдет сбой при загрузке 32-разрядного приложения (BadFormatException). Чтобы убедиться, что безопасный образ продолжает выполняться при загрузке 32-разрядного образа на компьютер с 64-разрядной операционной системой, следует использовать /CLRIMAGETYPE для изменения метаданных (.corflags), и пометить его для запуска в режиме WOW64. Следующая командная строка приведена для примера. (Замените ваш собственный символ записи.)
cl /clr:safe t.cpp /link /clrimagetype:pure /entry:?main@@$$HYMHXZ /subsystem:console
Сведения о получении декорированного имени см. в разделе Использование списка для просмотра декорированных имен. Дополнительные сведения о 64-разрядном программировании см. в разделе Настройка 64-разрядных программ (Visual C++).
Примеры, пошаговые руководства и подробные сведения см. в следующих разделах:
Метаданные и неименованные классы
Неименованные классы отображаются в двух метаданные следующим образом: $UnnamedClass$crc-of-current-file-name$index$, где index — соответствующее число неименованных классов в компиляции. Например, в следующем примере кода создается неименованный класс в метаданных.
// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;
Чтобы просмотреть метаданные, следует использовать Ildasm.exe.
Установка параметра компилятора в Visual Studio
Щелкните правой кнопкой мыши имя проекта в обозревателе решений и выберите пункт Свойства, чтобы открыть диалоговое окно Страницы свойств проекта.
Выберите папку Свойства конфигурации.
На странице свойств Общие измените свойство Поддержка среды CLR.
Примечание
Если в диалоговом окне Страницы свойств проекта включен параметр /clr, свойства параметров компилятора, несовместимые с /clr, также будут настроены соответствующим образом.Например, если используется параметр /RTC, а затем включается /clr, то параметр /RTC будет отключен.
Аналогичным образом при отладке приложения, созданного с помощью /clr, задайте для свойства Тип отладчика значение Смешанный или Только управляемый код.Для получения дополнительной информации см. Параметры проекта для конфигурации отладки C++.
Cведения о создании модулей см. в разделе /NOASSEMBLY (создать модуль MSIL).
Установка данного параметра компилятора программным способом
- См. раздел CompileAsManaged.