如何在C#中PInvoke另一个结构中的结构数组

How to PInvoke in C# an array of structs inside another struct

本文关键字:结构 数组 另一个 PInvoke      更新时间:2023-10-16

从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个值。