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

时间:2017-01-10 11:12:45

标签: c# c++ interop pinvoke marshalling

来自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结构数组并获取指向数组中每个项的指针(a因为我没有结构内容的定义,所以我需要指向每个项目的指针。但是我无法想出实现这一目标的方法,特别是因为图书馆限制了我对该结构所说的内容(甚至没有给出长度)。在C ++中,对于values_report.values[0]定义的每个项目,它只是countOfValues等等,但是当我将它编组为.NET时,我不知道如何使其工作。

有没有办法通过编组在C#中解决这个问题?

1 个答案:

答案 0 :(得分:2)

values不是struct数组。它是struct的指针数组。

根据评论和查看代码,您似乎没有结构本身的定义。这就是所谓的不透明指针。您不需要知道结构大小,只需处理指向结构的指针,然后将其传递回库中。

从数组中读取不透明指针值,如下所示:

IntPtr Value = Marshal.ReadIntPtr(values_report.values, i*IntPtr.Size);

这获得了i th 值。

相关问题