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