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

我正在尝试将我的引擎中的一些function从c ++移植到C#。 我使用非托管c ++编译我的引擎作为dll,并且只在C#包装器中使用extern“C”函数。

我有各种函数,可以获取并返回Vector3df 。 这被定义为

 typedef Vector3d Vector3df; 

f32实际上是一个float 。 该类本身只有一些名为xy和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。

谢谢!

您需要做的就是定义一个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 ++类之间的转换。