有没有办法通过 native 互操作将C#对象引用(类类型,而不是结构)传入和传出C++?
这是我的用例:
我试图用C#编写游戏引擎,但想使用 native (C++)物理库。物理库维护所有物理物体的内部状态,并允许用户将少量数据(指针)与每个物体关联。进行物理模拟勾号后,该库将提供所有已移动物理物体的列表。我想遍历此列表,并将所有更改中继到相应的C#对象。
问题是:将C#中的对象与C++中相应的物理实体相关联的最佳方法是什么?
我可以想到几种方法:
有不知道的类似选项3的机制吗? C++/CLI不是一个选择,因为我要支持没有它的平台。
最佳答案
我建议使用专门针对此类情况的工具,即System.Runtime.InteropServices.GCHandle
。
用法
在:
GCHandle
或GCHandleType.Normal
为您的CLR对象分配一个GCHandleType.Weak
。 GCHandle
将IntPtr
转换为GCHandle.ToIntPtr
。 IntPtr
作为您提到的userdata指针传递到C++端。 出去:
IntPtr
。 IntPtr
将GCHandle
转换回GCHandle.FromIntPtr
Target
的GCHandle
属性可获取原始CLR对象。 当不再从C++端引用CLR对象时(要么因为C++对象被破坏,要么因为您将userdata指针重置为例如
IntPtr.Zero
),请通过调用GCHandle
释放GCHandle.Free
。您应分配哪种类型的
GCHandle
取决于您是否希望GCHandle
使对象保持 Activity 状态(GCHandleType.Normal
)(否)(GCHandleType.Weak
)。