关于将托管 C++ 与非托管 C++ 混合使用,我有几个具体问题:
- 如果我省略
ref
并value
在类/结构声明中,这是否会自动使类/结构不受管理?还是我还需要包含#pragma unmanaged
and#pragma managed
指令? - 非托管和托管类型的兼容性如何?例如,我可以在托管类中有一个非托管对象,对吗?我可以将非托管类/结构传递给托管函数(即将 std::string 传递给托管函数)吗?
谢谢你的帮助,
亚历克斯
您不能拥有混合类型(包含托管对象的本机类,反之亦然)。可能的做法是在托管类中拥有指向本地类的指针,以及在gcroot
本地类中使用模板包装的托管句柄。这是为了确保垃圾收集器永远不会尝试移动本机数据(这会破坏纯本机代码持有的指针)。
托管类型始终使用托管代码实现。如果原生类型调用托管类型,则它们必须使用托管代码实现。
#pragma managed(push, off)
是强制将代码编译为本机的方法。这样做的几个原因:来自 C++ 编译器的更好的优化,不能被垃圾收集打断等。或者,您可以使用/clr:pure
强制所有代码编译为托管,甚至/clr:safe
做同样的事情,也使它是可验证的。
任何编译为托管的代码都可以接受本机和托管类型作为参数和返回值。并且该代码可以在托管类型、本机类型或自由(全局)函数中。