从 c++ 到 C# 的 3D 矢量结构
3D Vector structure from c++ to C#
我正在尝试将引擎中的某些功能从c ++移植到C#。我将我的引擎编译为具有非托管 c++ 的 dll,并且仅在 C# 包装器中使用外部"C"函数。
我有各种功能可以获取和返回Vector3df
。这被定义为
typedef Vector3d<f32> Vector3df;
而f32
实际上是一个float
.类本身只有一些称为 x y 和 z 的成员以及很多方法。
我可以用 C# 重写整个类,这不是问题,但无论如何都有可以匹配 2
的吗?让我们以以下函数为例:
extern "C" void SetColor(Vector3df color)
extern "C" Vector3df GetColor()
我想在 C# 中有这样的东西:
[DllImport("Engine.dll", EntryPoint = "SetColor", CallingConvention = CallingConvention.Cdecl)]
static extern void SetColor(Vector3df color);
[DllImport("Engine.dll", EntryPoint = "GetColor", CallingConvention = CallingConvention.Cdecl)]
static extern Vector3df GetColor();
无论如何,我可以在其中编写与此作品类似的代码吗?
请注意,我绝不是 C# 大师。在编组方面,我迷失了方向。我这样做主要是为了为我的游戏制作地图编辑器,而不必学习Qt或wxWidgets。
谢谢!
您需要做的就是定义一个 C# 结构,该结构具有与 c++ dll 预期的等效二进制布局。假设只有x,y,z没有包装,那只是...
[StructLayout(LayoutKind.Sequential)] //Required, as default layout is Auto
struct Vector3df {
public float x, y, z;
}
这应该适用于你提供的 C 和 C# 函数签名。如果您希望在 Vector3df 类上调用任何方法,则会出现困难,因为您无法 p/invoke C++类方法。您需要将每个方法包装为纯 C 函数,就像使用 Set/GetColor 所做的那样。
如果您尝试导入一个大型库,最终会做很多工作,并且使用 C++/CLI 创建包装器可能更简单。另一种选择可能是使用 cxxi 进行调查,但我没有使用它的经验。
最简单的方法可能是创建另一个 C++/CLI 包装器 DLL,您可以在其中执行非托管类和托管C++类之间的转换。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 使用 vector 在 c++ 中声明 3D 数组结构
- 数据结构2d/3d瓦片数组C++
- 将结构(或类)从C DLL传递到C#(Unity 3D)
- 用于存储 3d 点的高效数据结构
- 这个特定的结构是如何像这样工作的?(合成现代3D图形编程)
- 从 c++ 到 C# 的 3D 矢量结构
- 使用特征矩阵构建3D结构的最有效选项
- 在3D结构中添加新的顶点