繁体   English   中英

将具有struct字段的结构从C ++返回到C#Pinvoke

[英]Return a struct with struct field from c++ to c# pinvoke

我正在尝试从本机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类型不能编组为返回值。 您可以将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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM