如何在C#中PInvoke另一个结构中的结构数组
How to PInvoke in C# an array of structs inside another struct
从C#.NET中,我正试图用这个签名从C++程序集(无法访问源代码)中PInvoke一个方法
result_code get_values(values_report_type *values_report)
其中,values_report
是指向values_report_type
的结构的指针,该结构包含由该方法返回的我正在查询的值。结构如下所示:
typedef struct{
int countOfValues;
values_type* values;
const char* name;
} values_report_type;
其中values
是结构体values_type
的数组。
以下是我认为的问题:我正在处理的C++程序集除了定义之外,没有提供任何关于values_type
结构内容的信息
typedef struct values_type_struct *values_type
根据文件,这种隐私是有意的。
所以,我的C#PInvoke现在看起来是这样的:
[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
internal static extern result_code get_values(out values_report_type values_report);
internal struct values_report_type{
int countOfValues;
IntPtr values;
string name;
}
这很好,给了我一个指向values
结构的指针,但我需要的是访问values_type
结构的数组,并获得一个指向数组中每个项的指针(我只需要指向每个项的一个指针,因为我没有结构内容的定义)。但我想不出实现这一点的方法,尤其是因为库限制了我对该结构的描述(甚至没有给出长度)。在C++中,对于countOfValues
定义的每个项,它将是类似于values_report.values[0]
之类的东西,但我不知道如何在将其编组到.NET.时使其工作
有没有一种方法可以在C#中通过编组来解决这个问题?
values
不是结构的数组。它是指向struct的指针的数组。
根据注释和代码,您似乎没有结构本身的定义。这就是所谓的不透明指针。您不需要知道结构的大小,只需处理指向结构的指针,然后将其传递回库。
从数组中读取不透明指针值,如下所示:
IntPtr Value = Marshal.ReadIntPtr(values_report.values, i*IntPtr.Size);
这就获得了第i个值。
相关文章:
- C++将文本文件中的数据读取到结构数组中
- JSON转换为nlohmann JSON-lib中的结构数组
- 需要帮助将结构数组传递给函数
- 在 64 位边界上对齐C++结构数组?
- 带有枚举方向/类型的气泡排序结构数组
- 在C++中访问结构数组中的数据
- 从指向结构数组的指针中提取元素
- 如何制作一个地图,其中的值是C++中的结构数组
- 如何在函数中显示结构数组
- 包含作为成员C++函数的结构数组
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- std::transform 将一个结构数组复制到另一个结构数组
- 将非托管结构数组封送到托管数组
- 显示结构数组
- 结构数组中所有类似字段的总和
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 在 glsl opengl 中将嵌套结构数组作为统一传递
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何将字符串字符与结构数组进行比较?
- C++结构数组