从 c++ 到 C# 的 3D 矢量结构

3D Vector structure from c++ to C#

本文关键字:结构 3D c++      更新时间:2023-10-16

我正在尝试将引擎中的某些功能从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++类之间的转换。