Return 从 c++ 到 c# pinvoke 的具有结构字段的结构

Return a struct with struct field from c++ to c# pinvoke

我正在尝试 return 从我的本机 c++ 代码到 c# 代码结构与其他结构的字段但出现错误:方法的类型签名与 PInvoke 不兼容。

这是我的 C++ 代码:

namespace path
{
struct Vector3
{
public:
    float x;
    float y;
    float z;
};

struct PointState
{
public:
    Vector3 position_;
    bool reformation;
};

}

这里是我的 api 函数:

extern "C"
{
PATHFINDER_API void SetupGraph(const char * json);
PATHFINDER_API path::Vector3 CheckReturn();
PATHFINDER_API path::PointState CheckStruct();
}

这是我的 C# 结构代码:

 [StructLayout(LayoutKind.Sequential)]
public struct Vector3
{
    public float x;
    public float y;
    public float z;
};

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct PointState
{
    [MarshalAs(UnmanagedType.LPStruct)]
    public Vector3 position_;
    public bool reformation;
};

和 Pinvoke DLLImport:

        [DllImport("path", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false, EntryPoint = "CheckStruct")]
    private static extern PointState CheckStruct();

    public PointState CheckReturn2()
    {
        return CheckStruct();
    }

请问,我做错了什么?我自己找不到答案。

您的代码存在一些问题:

  • 您在嵌套结构上使用了 [MarshalAs(UnmanagedType.LPStruct)],但这是错误的。该字段不是指针。应该删除该属性。
  • bool 类型无法编组到 return 值中。您可以将 C# bool 替换为 byte 来解决该问题,然后将该值与零进行比较。
  • 另外,您添加的一些属性似乎是不必要的。我怀疑您做了通常的事情,即随机尝试进行大量更改,然后将它们留在您在此处发布的代码中。

我会使用以下声明:

[StructLayout(LayoutKind.Sequential)]
public struct Vector3
{
    public float x;
    public float y;
    public float z;
};

[StructLayout(LayoutKind.Sequential)]
public struct PointState
{
    public Vector3 position_;
    private byte _reformation;
    public bool reformation { get { return _reformation != 0; } }
};

[DllImport("path", CallingConvention = CallingConvention.Cdecl)]
private static extern PointState CheckStruct();