下面的简单示例看起来很自然,但是它没有从结构中获取正确的值。C++ 代码:
#define E __declspec( dllexport )
struct XY {
int x, y;
};
extern "C" {
E XY* get_xy_ptr() {
XY p;
p.x = 15;
p.y = 23;
return &p;
}
}
使用此函数的 C# 代码将是:
record struct XY(int x, int y); // C# 10
// OR...
//struct XY
//{
// public int x;
// public int y;
//}
[DllImport("CppLibrary.dll")] static extern IntPtr get_xy_ptr();
IntPtr pointer = get_xy_ptr();
XY xy = Marshal.PtrToStructure<XY>(pointer);
Console.WriteLine("xy.x : {0}", xy.x);
Console.WriteLine("xy.y : {0}", xy.y);
但是,它没有得到预期的结果:
C++ Calls Demostration
----------------------
xy_ptr.x : 0 // expected 15
xy_ptr.y : 0 // expected 23
值得澄清的是,如果 C++ 函数不返回指针,即不是 XY*,而是返回显式 XY,并且在 C# 中我将显式结构声明为 return,而不是 IntPtr,则它可以完美运行。然而,这不是我要找的,我需要它是一个指针,因为它将在 Emscripten 中用于 WebAssemply,并且它不接受显式结构作为返回。
感谢您的关注。