从C++到C#的结构

Struct from C++ to C#

本文关键字:结构 C++      更新时间:2023-10-16

我有一个项目,它使用的库主要是基于C++构建的。这个库提供的DLL,我已经导入到我的C#项目中。在Unity中导入以下方法后:

    [DllImport("pst")]
private static extern int pst_get_sensor(PSTSensor sensor);

我需要这个PSTSensor结构,所以实际使用该方法。在C++.h文件中,结构体定义为:

struct PSTSensor
{
        char    name[80];       /**< Device name */
        int     id;             /**< Device identifier (for other tracking interfaces */
        float   pose[16];       /**< Device pose estimate as row-major matrix */
        double  timestamp;      /**< Time the data was recorded */
};

我曾尝试在C#中复制它,最终得到了以下结果:

    struct PSTSensor{
    PSTSensor(char[] name, int id, float[] pose, double timestamp){
        this.name = name;
        this.id = id;
        this.pose = pose;
        this.timestamp = timestamp;
    }
    public char[] name;
    public int id;
    public float[] pose;
    public double timestamp;
}

在这个项目附带的示例C++代码中,声明调用pst_get_sensor(&sensor) this"&"招牌,我不认识?我该如何在C#中调用此方法并使其工作?

我想我毁了这个结构,因为我以前从来没有和他们合作过。至少它不再在编译中抛出错误,但我认为它仍然是错误的。对此有什么想法吗?

非常感谢,Smiley

我不确定我是否完全回答了你的问题,但在c++中,&用于通过引用传递参数,这意味着您传入的参数可以在函数内部进行操作。在我看来,原始函数似乎是用来填充传感器结构的。

int C#您可以使用ref或out关键字通过引用传递:

private static extern int pst_get_sensor(PSTSensor ref sensor);

为什么在C#实现中添加构造函数?

它表明,您所需要做的就是将参数声明为ref

private static extern int pst_get_sensor(ref PSTSensor sensor);

如果你想看看一个例子,这里有一个

您没有显示函数的C++声明,但给出了这样的调用:

pst_get_sensor(&sensor);

大概是这样声明的:

int pst_get_sensor(PSTSensor *sensor);

函数接收指向结构的指针。这一点很清楚,因为调用使用了&运算符,该运算符获取对象的地址。

在C#端,您可以将此参数转换为ref参数。像这样:

[DllImport(...)]
static extern int pst_get_sensor(ref PSTSensor sensor);

现在,您的另一个问题是您的结构声明不正确。它包含内联数组,您必须将这些数组的长度传达给整理器。像这样:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct PSTSensor
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string name;
    public int id;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public float[] pose;
    public double timestamp;
}