1

下面的简单示例看起来很自然,但是它没有从结构中获取正确的值。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,并且它不接受显式结构作为返回。

感谢您的关注。

4

0 回答 0