混合托管和非托管C++代码

Mixing managed and unmanaged C++ code?

本文关键字:代码 C++ 混合      更新时间:2023-10-16

我有几个关于混合托管C++与非托管C++的具体问题:

  1. 如果我在类/结构声明中省略refvalue,这是否会自动使类/结构不受管理?还是我仍然需要包含#pragma unmanaged#pragma managed指令?
  2. 非托管类型和托管类型的兼容性如何?例如,我可以在托管类中有一个非托管对象,对吗?我可以将非托管类/结构传递给托管函数(即将 std::string 传递给托管函数)吗?

感谢您的帮助,

亚历克斯

不能有混合类型(包含托管对象的本机类,反之亦然)。 可能的方法是在托管类中有一个指向本机类的指针,并在本机类中有一个用gcroot模板包装的托管句柄。 这是确保垃圾回收器永远不会尝试移动本机数据所必需的(这会破坏纯本机代码持有的指针)。

托管

类型始终使用托管代码实现。 如果本机类型调用托管类型,则必须使用托管代码实现这些类型。

#pragma managed(push, off)是强制将代码编译为本机代码的方法。 这样做有几个原因:C++编译器的更好优化,不能被垃圾回收等打断。 或者,您可以使用/clr:pure强制将所有代码编译为托管代码,甚至可以/clr:safe执行相同的操作并使其可验证。

编译为托管的任何代码都可以接受本机类型和托管类型作为参数和返回值。 该代码可以位于托管类型、本机类型或自由(全局)函数中。