适用于 .NET 和 UWP 的组件扩展

C++ 标准允许编译器供应商向语言提供非标准扩展。 Microsoft 提供了有助于将本机 C++ 代码连接到 .NET Framework 或通用 Windows 平台 (UWP) 上运行的代码的扩展。 .NET 扩展称为“C++/CLI”,并生成在 .NET 托管执行环境(称为“公共语言运行时 (CLR)”)中执行的代码。 UWP 扩展称为“C++/CX”,并生成本机代码。

注意

对于新应用程序,建议使用 C++/WinRT,而不是 C++/CX。 C++/ WinRT 是 Windows 运行时 API 的新标准 C++17 语言投影。 我们将继续支持 C++/CX 和 WRL,但强烈建议新应用程序使用 C++/WinRT。 有关详细信息,请参阅 C++/WinRT。

两个运行时,一组扩展

C++/CLI 扩展了 ISO/ANSI C++ 标准,并在 ECMA C++/CLI 标准下定义。 有关详细信息,请参阅使用 C++/CLI 进行 .NET 编程 (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 struct
否 声明接口。 接口类
枚举类

enum struct
否 声明枚举。 枚举类
property 是 声明属性。 property
delegate 是 声明委托。 delegate(C++/CLI 和 C++/CX)
event 是 声明事件。 event

重写说明符

可以使用下列关键字来限定派生的替代行为。 虽然 new 关键字不是 C++ 的扩展,但仍列于此处,因为它可以在附加上下文中使用。 某些说明符还可用于本机编程。 有关详细信息,请参阅如何:在本机编译中声明替代说明符 (C++/CLI)。

关键字 区分上下文 目的 参考
abstract 是 指示函数或类是抽象的。 abstract
new 否 指示函数不替代基类版本。 新(vtable 中的新槽)
override 是 指示方法必须替代基类版本。 override
sealed 是 防止类用作基类。 sealed

泛型关键字

已添加下列关键字来支持泛型类型。 有关详细信息,请参阅泛型。

关键字 区分上下文 目的
generic 否 声明泛型类型。
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 对象。 typeid

声明符

下列类型声明符指示运行时自动管理已分配对象的生存期和删除。

运算符 目的 参考
^ 声明指向对象的句柄;即指向 Windows 运行时或不再可用时自动删除的 CLR 对象的指针。 对象句柄运算符 (^)
% 声明跟踪引用;即对 Windows 运行时或不再可用时自动删除的 CLR 对象的引用。 跟踪引用运算符

本节列出了其他编程构造以及与 CLR 相关的主题。

主题 说明
__identifier (C++/CLI) (Windows 运行时和 CLR)允许使用关键字作为标识符。
变量自变量列表 (...) (C++/CLI) (Windows 运行时和 CLR)允许函数使用可变数量参数。
对应于 C++ 本机类型的 .NET Framework 类型 (C++/CLI) 列出替代 C++ 整型类型的 CLR 类型。
appdomain __declspec 修饰符 __declspec 修饰符规定每个 appdomain 都存在静态和全局变量。
使用 /clr 时的 C 样式强制转换 (C++/CLI) 描述如何解释 C 样式转换。
__clrcall 调用约定 指示符合 CLR 的调用约定。
__cplusplus_cli 预定义宏
自定义属性 描述如何定义自己的 CLR 属性。
异常处理 概述异常处理。
显式重写 演示成员函数如何替代任意成员。
友元程序集 (C++) 讨论客户端程序集如何访问程序集组件中的所有类型。
装箱 演示值类型进行装箱的条件。
编译器对类型特征的支持 讨论如何在编译时检测类型的特征。
managed、unmanaged 杂注 演示 managed 和 unmanaged 函数如何共存于同一模块中。
process __declspec 修饰符 __declspec 修饰符规定每个 process 都存在静态和全局变量。
反射 (C++/CLI) 演示运行时类型信息的 CLR 版本。
字符串 讨论编译器如何将字符串文本转换为 String。
类型转发 (C++/CLI) 允许将一个传送程序集中的类型移动到另一个程序集,从而使客户端代码无需重新编译。
用户定义的属性 演示用户定义的属性。
#using 指令 导入外部程序集。
XML 文档 使用 /doc(处理文档注释)(C/C++) 解释基于 XML 的代码文档

另请参阅

使用 C++/CLI (Visual C++) 进行 .NET 编程
本机和 .NET 的互操作性