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

时间:2012-02-16 15:04:15

标签: c# c++ vector struct marshalling

我正在尝试将我的引擎中的一些功能从c ++移植到C#。 我使用非托管c ++编译我的引擎作为dll,并且只在C#包装器中使用extern“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#guru。我在编组方面迷失了。我主要是为了制作我的游戏的地图编辑器而不必学习Qt或wxWidgets。

谢谢!

2 个答案:

答案 0 :(得分:2)

您需要做的就是定义一个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进行调查,但我没有使用此功能。

答案 1 :(得分:1)

最简单的方法可能是创建另一个C ++ / CLI包装器DLL,在其中执行非托管和托管C ++类之间的转换。