从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 ++类之间的转换。