我正在努力将C结构数据导出到C#.
假设我有以下结构代表一个3浮点向量:
// C++
struct fvec3
{
public:
float x, y, z;
fvec3(float x, float y, float z) : x(x), y(y), z(z) { }
};
// C#
[StructLayout(LayoutKind.Sequential)]
struct fvec3
{
public float x, y, z;
public fvec3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
}
现在,如果我想使用从C#到C的fvec3,我可以使用以下内容而不会出现问题:
// C++
__declspec(dllexport) void Import(fvec3 vector)
{
std::cout << vector.x << " " << vector.y << " " << vector.z;
}
// C#
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Import(fvec3 vector);
...
Import(new fvec3(1, 2, 3)); // Prints "1 2 3".
现在的问题是反过来:将C fvec3返回给C#.我怎样才能做到这一点?
我已经看到许多C#实现使用了以下内容:
// C#
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Export(out fvec3 vector);
...
fvec3 vector;
Export(out vector); // vector contains the value given by C++
但是我该如何编写C Export功能呢?
我尝试了所有我能想到的签名和身体:
// Signatures:
__declspec(dllexport) void Export(fvec3 vector)
__declspec(dllexport) void Export(fvec3* vector)
__declspec(dllexport) void Export(fvec3& vector)
// Bodies (with the pointer variants)
vector = fvec3(1, 2, 3);
memcpy(&fvec3(1, 2, 3), &vector, sizeof(fvec3));
*vector = new fvec(1, 2, 3);
其中一些没有效果,一些返回垃圾值,一些导致崩溃.
最佳答案 ref和out参数通常与指针参数匹配.
试试这个:
__declspec(dllexport) void Export(fvec3 *vector)
{
*vector = fvec3(1, 2, 3);
}
(未测试)
或者,您应该只需从函数中返回一个fvec3:
// C++
__declspec(dllexport) fvec3 Export(void)
{
return fvec3(1, 2, 3);
}
// C#
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern fvec3 Export();
...
fvec3 vector = Export();
(未测试)