是否有任何方法通过本机互操作将C#对象引用(类类型,而不是结构)传入和输出C++?
这里是我的用例:
我试图用C#编写一个游戏引擎,但想使用本地(C++)物理库。物理库维护所有物理体的内部状态,并允许用户将少量数据(指针)与每个体相关联。在进行了物理模拟之后,这个库提供了所有移动的物理物体的列表。我想迭代这个列表,并将所有更改转发到相应的C#对象。
问题是: C#中的对象与C++中相应的物理体相关联的最佳方法是什么?
我可以想出几种方法:
有没有像选项3这样的机制我不知道?C++/CLI不是一个选项,因为我想支持没有它的平台。
发布于 2015-08-20 01:43:35
我建议使用专门为这种情况而设计的工具,即System.Runtime.InteropServices.GCHandle。
使用
在:
GCHandle或GCHandleType.Normal为CLR对象分配一个GCHandleType.Weak。GCHandle将IntPtr转换为GCHandle.ToIntPtr。IntPtr作为您提到的userdata指针传递到C++端。退出:
IntPtr从C++那边回来。IntPtr将GCHandle转换回GCHandle.FromIntPtrTarget属性的GCHandle获取原始的CLR对象。当不再从C++端引用CLR对象时(或者因为C++对象被破坏,或者因为您将用户数据指针重置为例如IntPtr.Zero),则通过调用GCHandle.Free释放GCHandle。
您应该分配哪种类型的GCHandle取决于您是否希望GCHandle保持对象活动(GCHandleType.Normal) (GCHandleType.Weak)。
发布于 2015-08-19 21:22:33
Marshal.GetFunctionPointerForDelegate获取要传递给非托管端的地址。唯一要注意的是,您必须确保回调使用的是__stdcall。另外,请记住,AccessViolationException在.NET中通常是不可捕捉的。
https://stackoverflow.com/questions/32105089
复制相似问题