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