从C+传递结构(或类)+;dll到C#(Unity 3D)

从C+传递结构(或类)+;dll到C#(Unity 3D),c#,c++,dll,plugins,interop,C#,C++,Dll,Plugins,Interop,我正在写一个包装器来从传感器获取一些数据。虽然我在传递int、float和它们的数组方面没有问题,但我很难掌握如何传递结构 代码摘要 C++端 结构如下: struct HandInfo { int id; float x, y, z; }; 在某一点上,一个静态的、全局可见的HandInfo leftHand会被可通过以下包装器函数检索的值填充: extern EXPORT_API HandInfo MyWrapper_getLeftHand() { return h

我正在写一个包装器来从传感器获取一些数据。虽然我在传递int、float和它们的数组方面没有问题,但我很难掌握如何传递结构

代码摘要

C++端

结构如下:

struct HandInfo
{
    int id;
    float x, y, z;
};
在某一点上,一个静态的、全局可见的HandInfo leftHand会被可通过以下包装器函数检索的值填充:

extern EXPORT_API HandInfo MyWrapper_getLeftHand()
{
    return handtracker.getLeftHand();
}
其中handtracker只是包装类的一个实例

C#side

一旦声明了extern函数

[DllImport("MyWrapper")]
private static extern HandInfo MyWrapper_getLeftHand();
在C#端,理想情况下,我将拥有相同的结构类型

public struct HandInfo
{
    public int id;
    public float x, y, z;
}
并指定一个变量

HandInfo hi = MyWrapper_getLeftHand(); // NAIVELY WRONG CODE
可以理解,这是行不通的

实现这一目标的方法是什么

我非常感谢你的帮助。 谢谢你的时间。

它应该正确工作(至少在这里的一个小的C++ +C项目中,我可以使它与<<代码>结构> <代码>,在x86和x64中)< /p>


唯一的一件事是,您必须声明
CallingConvention=CallingConvention.Cdecl

,它以什么方式不起作用?你得到了什么错误?很好,David,我使用的是Unity 3D中的dll,如果我使用上面的代码,它会非常安静地崩溃,我不知道在这种情况下如何拦截调用堆栈。这种约定的目的是什么?谢谢,我会尽快尝试。@SteakOverflow它描述了调用时如何将参数/返回值放入内存。C/C++通常使用Cdecl,Windows API StdCallMan!!!谢谢你知道即使我的结构中有数组,这种方法是否有效吗?@SteakOverflow它变得很难看。。。C#中也有,但它们需要不安全的代码,而且使用起来有点麻烦(因为它们不是真正的C#数组,所以不能使用C#数组方法)@SteakOverflow没有。一般来说,如果在C#端进行内存分配,并在C/C++端使用从C#接收的内存/结构,那么使用起来会更容易。结构作为
ref
/
out
传递,内存作为
字节[]
[DllImport("MyWrapper.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern HandInfo MyWrapper_getLeftHand();