将带有结构字段的结构从 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有 unsigned char* 的结构从 C# 传递到 C++?

从 C++ 到 C# 的结构中的 Marshal 回调

无法将结构从 C++ 返回到 C#

将结构数组从 C# 传递到 C++

如何将结构数组从 c++ 传递到 c#?

将包含 int 和 int[] 的结构从 C# 编组到 C++