Расширения компонентов для .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