将带有结构字段的结构从 c++ 返回到 c# pinvoke
Posted
技术标签:
【中文标题】将带有结构字段的结构从 c++ 返回到 c# pinvoke【英文标题】:Return a struct with struct field from c++ to c# pinvoke 【发布时间】:2018-02-26 11:06:31 【问题描述】:我正在尝试从我的本机 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();
请问,我做错了什么?我自己找不到答案。
【问题讨论】:
您的代码不完整。我们看不到声明PointState
的 C++ 代码。
是的,抱歉,已修复!
【参考方案1】:
您的代码存在一些问题:
您在嵌套结构上使用了[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();
【讨论】:
天哪,非常感谢!我认为问题出在结构中,而问题出在布尔中。是的,你完全正确,我尽我所能,而不是清理。以上是关于将带有结构字段的结构从 c++ 返回到 c# pinvoke的主要内容,如果未能解决你的问题,请参考以下文章