Расширения компонентов для .NET и UWP

Стандарт C++ позволяет поставщикам компиляторов предоставлять нестандартные расширения языка. Корпорация Майкрософт предоставляет расширения для подключения собственного кода C++ к коду, выполняемому на платформе .NET Framework или универсальной платформе Windows (UWP). Расширения .NET называются C++/CLI и создают код, который выполняется в управляемой среде выполнения .NET, известной как Common Language Runtime (CLR). Расширения UWP называются C++/CX. Они создают собственный машинный код.

Примечание

Для новых приложений рекомендуется использовать C++/WinRT вместо C++/CX. C++/WinRT — это новая стандартная языковая проекция C++17 для API среды выполнения Windows. Мы продолжим предоставлять поддержку C++/CX и WRL, но в новых приложениях настоятельно рекомендуется использовать C++/WinRT. См. дополнительные сведения о C++/WinRT.

Две среды выполнения, один набор расширений

C++/CLI расширяет стандарт C++ ISO/ANSI и определяется стандартом C++/CLI Ecma. Дополнительные сведения см. в статье Программирование .NET с использованием C++/CLI (Visual C++).

Расширения C++/CX представляют собой подмножество C++/CLI. Несмотря на то, что в большинстве случаев синтаксис расширения идентичен, создаваемый код зависит от того, указан ли параметр компилятора /ZW, предназначенный для UWP, или параметр /clr, предназначенный для .NET. Если для создания проекта используется Visual Studio, эти параметры устанавливаются автоматически.

Ключевые слова типов данных

Расширения языка содержат агрегатные ключевые слова, состоящие из двух токенов, разделенных пробелом. Когда токены используются отдельно, они могут иметь одно значение, а при использовании вместе — другое значение. Например, ключевое слово "ref" — это обычный идентификатор, а слово "class" — ключевое слово, объявляющее собственный класс. Однако при объединении этих слов в строку ref class, полученное агрегатное ключевое слово объявляет сущность, которая называется класс среды выполнения.

Расширения также содержат контекстно-зависимые ключевые слова. Ключевое слово рассматривается как контекстно-зависимое на основе типа содержащего его оператора и размещения в нем. Например, токен "property" может быть идентификатором или может объявлять специальный тип открытого члена класса.

В следующей таблице перечислены ключевые слова в расширении языка C++.

Ключевое слово Контекстно-зависимое? Цель Ссылка
ref class

ref struct
Нет Объявляет класс. Классы и структуры
value class

value struct
Нет Объявляет класс значения. Классы и структуры
Класс interface

interface struct
Нет Объявляет интерфейс. Класс interface
Класс перечисления

enum struct
Нет Объявляет перечисление. Класс перечисления
property Да Объявляет свойство. property
delegate Да Объявляет делегат. Delegate (C++/CLI и C++/CX)
event Да Объявление события. event

Спецификаторы переопределения

Для указания поведения переопределения при наследовании можно использовать указанные ниже ключевые слова. newХотя ключевое слово не является расширением C++, оно указывается здесь, так как его можно использовать в дополнительном контексте. Некоторые спецификаторы также допустимы для машинного программирования. Дополнительные сведения см. в разделе инструкции. объявление описателей переопределения в компиляциях в собственном коде (C++/CLI).

Ключевое слово Контекстно-зависимое? Цель Ссылка
abstract Да Указывает, что функции или классы являются абстрактными. abstract
new Нет Указывает, что функция не является переопределением версии базового класса. new (новая ячейка в таблице vtable)
override Да Указывает, что метод должен быть переопределением версии базового класса. override
sealed Да Предотвращает использование классов в качестве базовых классов. sealed

Ключевые слова для универсальных шаблонов

Указанные ниже ключевые слова добавлены для поддержки универсальных типов. Дополнительные сведения см. в статье Универсальные шаблоны.

Ключевое слово Контекстно-зависимое? Назначение
шаблона Нет Объявляет универсальный тип.
where Да Определяет ограничения, применяемые к параметру универсального типа.

Прочие ключевые слова

В расширения C++ добавлены следующие ключевые слова.

Ключевое слово Контекстно-зависимое? Цель Ссылка
finally Да Указывает поведение обработки исключений по умолчанию. Обработка исключений
for each, in Нет Перечисляет элементы коллекции. for each, in
gcnew Нет Выделяет типы в куче со сбором мусора. Используйте вместо new и delete . ref new, gcnew
ref new Да Выделяет тип среды выполнения Windows. Используйте вместо new и delete . ref new, gcnew
initonly Да Указывает, что член можно инициализировать только в объявлении или в статическом конструкторе. initonly (C++/CLI)
literal Да Создает переменную литерала. literal
nullptr Нет Означает, что обработчик или указатель не указывает на объект. nullptr

Конструкции шаблонов

Перечисленные ниже языковые конструкции реализуются в виде шаблонов, а не ключевых слов. При указании параметра компилятора /ZW они определяются в пространстве имен lang. При указании параметра компилятора /clr они определяются в пространстве имен cli.

Ключевое слово Цель Ссылка
array. Объявляет массив. Массивы
interior_ptr (Только для среды CLR). Указывает на данные в ссылочном типе. interior_ptr (C++/CLI)
pin_ptr (Только для среды CLR). Указывает на ссылочные типы среды CLR, чтобы временно отключить систему сборки мусора. pin_ptr (C++/CLI)
safe_cast Определяет и выполняет оптимальный метод приведения для типа среды выполнения. safe_cast
typeid (Только для среды CLR). Извлекает объект System.Type, описывающий заданный тип или объект. типа

Деклараторы

Следующие деклараторы типа указывают среде выполнения на необходимость автоматически управлять временем существования и удалением выделенных объектов.

Оператор Назначение Ссылка
^ Объявляет дескриптор объекта, то есть указатель на объект среды выполнения Windows или объект CLR, который автоматически удаляется, если больше не используется. Оператор Handle to Object (^)
% Объявляет отслеживаемую ссылку, то есть ссылку на объект среды выполнения Windows или объект CLR, который автоматически удаляется, если больше не используется. Отслеживаемый оператор ссылки

В этом разделе перечислены дополнительные программные конструкции и разделы, относящиеся к среде CLR.

Раздел Описание
__identifier (C++/CLI) (Среда выполнения Windows и среда CLR) Позволяет использовать ключевые слова как идентификаторы.
Списки аргументов переменных (...) (C++/CLI) (Среда выполнения Windows и среда CLR) Позволяет функции принимать переменное число аргументов.
Эквиваленты собственным типам C++ в .NET Framework (C++/CLI) Перечисляет типы среды CLR, используемые вместо целочисленных типов C++.
AppDomain__declspec Модификатор __declspec модификатор, который требует, чтобы статические и глобальные переменные существовали для каждого домена AppDomain.
Приведение в стиле C с использованием параметра /clr (C++/CLI) Описывается интерпретация приведений в стиле C.
Соглашение о вызовах __clrcall Указывает соглашение о вызываемом CLR-согласованности.
__cplusplus_cli Предопределенные макросы
Настраиваемые атрибуты Описывается определение собственных атрибутов среды CLR.
Обработка исключений Общие сведения об обработке исключений.
Явные переопределения Демонстрируется переопределение произвольных членов функциями-членами.
Дружественные сборки (C++) Описывается доступ клиентской сборки ко всем типам в компоненте сборки.
Упаковка-преобразование Описываются условия, при которых упаковываются типы значений.
Поддержка характеристик типов в компиляторе Описывается выявление характеристик типов во время компиляции.
управляемые, неуправляемые директивы pragma Демонстрируется сосуществование управляемых и неуправляемых функций в одном модуле.
Обработка__declspec Модификатор __declspec модификатор, который требует, чтобы статические и глобальные переменные существовали для каждого процесса.
Отражение (C++/CLI) Демонстрируется CLR-версия данных типа во время выполнения.
String Описывается преобразование компилятором строковых литералов в объект String.
Пересылка типов (C++/CLI) Разрешает перемещение типа из поставляемой сборки в другую сборку, чтобы исключить необходимость повторной компиляции клиентского кода.
Определяемые пользователем атрибуты Демонстрируются атрибуты, определяемые пользователем.
Директива #using Импортирует внешние сборки.
Документация XML Пояснения к документации кода на основе XML с использованием /doc (обработка комментариев к документации) (C/C++)

См. также раздел

Программирование .NET с использованием C++/CLI (Visual C++)
Взаимодействие машинного кода и .NET