从C++到C#的结构
Struct from C++ to C#
我有一个项目,它使用的库主要是基于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;
}
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?