C++ 托管扩展概念
常见移植问题
本节将讨论在开始使用 C++ 托管扩展时遇到的一些常见问题和误解。
- /clr 编译器开关是必需的。如果没有它,编译器将无法识别在 C++ 托管扩展编程中使用的任何指令、关键字和数据类型。有关 Visual Studio 项目的信息,请参见将 C++ 托管扩展支持添加到现有应用程序。
- .NET 模块用 #using 指令来引用。标准头文件不能使用 #using 指令来包含,而 .NET 模块不能使用 #include 指令来包含。
- 所有内置构造都在命名空间内定义。此外,经常会使用 System::Collections、System::IO 和 System::Text 等嵌套命名空间。.NET 类型的参考帮助主题会在该主题的底部包括在其中定义这些数据类型的命名空间,但这些命名空间使用的是公共语言运行库点运算符 (.),而不是 C++ 范围解析运算符 (::)。C++ 托管扩展需要 C++ 范围解析运算符。
- 类、结构和枚举默认为本机 C++ 类型(__gc 或 __value 关键字除外)。(__gc 表示类,__value 表示结构和枚举。)或者,函数在默认情况下受到管理,但可以用 #pragma managed 和 #pragma unmanage 指令控制这种默认行为。
- 如果不进行封送处理,则不能在托管函数和本机函数之间传递数据类型;强制转换将无法使用。Marshal 类提供可用于在托管函数和非托管函数之间封送数据的方法。