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