关于将托管C ++与非托管C ++混合,我有几个具体问题:
ref
和value
,是否会自动使类/结构不受管理?或者我是否仍需要包含#pragma unmanaged
和#pragma managed
指令?感谢您的帮助,
亚历
答案 0 :(得分:2)
您不能拥有混合类型(包含托管对象的本机类,反之亦然)。可能的是在本机类中有一个指向托管内部本机类的指针,以及一个用gcroot
模板包装的托管句柄。这需要确保垃圾收集器永远不会尝试移动本机数据(这会破坏纯本机代码所持有的指针)。
托管类型始终使用托管代码实现。如果本机类型调用托管类型,则必须使用托管代码实现。
#pragma managed(push, off)
是强制代码编译为本机代码的方法。有两个原因要做:从C ++编译器中进行更好的优化,不能被垃圾回收等中断。或者,您可以使用/clr:pure
强制所有代码编译为托管,甚至{{1做同样的事情并使其可以验证。
任何编译为托管的代码都可以接受本机和托管类型作为参数和返回值。并且该代码可以在托管类型,本机类型或自由(全局)函数内部。