Расширения компонентов для .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
No Объявляет класс. Классы и структуры
value class

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

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

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

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

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

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

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

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

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

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

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

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

Деклараторы

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

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

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

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

См. также

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