[英]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.