gpt4 book ai didi

c# - 如何将 C# 对象引用传入和传出 C++

转载 作者:太空狗 更新时间:2023-10-29 20:23:37 26 4
gpt4 key购买 nike

有没有办法通过 native 互操作将 C# 对象引用(类类型,而不是结构)传入和传出 C++?

这是我的用例:

我正在尝试用 C# 编写游戏引擎,但想使用 native (C++) 物理库。物理库维护所有物理实体的内部状态,并让用户将少量数据(指针)与每个实体相关联。在一个物理模拟 tick 之后,库会提供所有移动的物理物体的列表。我想遍历此列表并将所有更改中继到相应的 C# 对象。

问题是:将 C# 中的对象与 C++ 中相应的物理实体相关联的最佳方式是什么?

我可以想到几个方法:

  1. 为每个 body 赋予某种 ID,在 C++ 中将 ID 与 body 相关联,并在 C# 中维护 ID 到相应对象的映射。这对我来说似乎是不必要的间接,即使使用优化的映射机制也是如此。
  2. 利用将 C# 委托(delegate)(可以隐式引用 C# 对象实例)编码为 C++ 函数指针的能力。这可能是最好的方法;我不知道 C# 是如何实现委托(delegate)的,也不知道这会带来什么类型的开销。
  3. 寻找其他方式在 C++ 中引用 C# 对象,并将该引用与每个本地物理实体相关联。

是否有任何我不知道的类似选项 3 的机制? C++/CLI 不是一个选项,因为我想支持没有它的平台。

最佳答案

我建议使用专为这种情况设计的工具,即 System.Runtime.InteropServices.GCHandle

用法

在:

  1. 使用 GCHandleType.NormalGCHandleType.Weak 为您的 CLR 对象分配一个 GCHandle
  2. 通过 GCHandle.ToIntPtrGCHandle 转换为 IntPtr
  3. IntPtr 作为您提到的用户数据指针传递给 C++ 端。

输出:

  1. 从 C++ 端获取 IntPtr
  2. 通过 GCHandle.FromIntPtrIntPtr 转换回 GCHandle
  3. 使用 GCHandleTarget 属性获取原始 CLR 对象。

当 C++ 端不再引用 CLR 对象时(因为 C++ 对象被销毁或者因为您将用户数据指针重置为例如 IntPtr.Zero),释放 GCHandle 通过调用 GCHandle.Free

您应该分配哪种类型的 GCHandle 取决于您是否希望 GCHandle 使对象保持事件状态 (GCHandleType.Normal) (GCHandleType.Weak)。

关于c# - 如何将 C# 对象引用传入和传出 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com