其他分享
首页 > 其他分享> > 混合托管和非托管C代码?

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

作者:互联网

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

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

谢谢你的帮助,

亚历克斯

解决方法:

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

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

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

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

标签:c,c-cli
来源: https://codeday.me/bug/20191009/1876718.html