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();
我正在尝试 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();