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

时间:2012-05-23 22:57:46

标签: c++ c++-cli

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

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

    亚历

1 个答案:

答案 0 :(得分:2)

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

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

#pragma managed(push, off)是强制代码编译为本机代码的方法。有两个原因要做:从C ++编译器中进行更好的优化,不能被垃圾回收等中断。或者,您可以使用/clr:pure强制所有代码编译为托管,甚至{{1做同样的事情并使其可以验证。

任何编译为托管的代码都可以接受本机和托管类型作为参数和返回值。并且该代码可以在托管类型,本机类型或自由(全局)函数内部。