簡體   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