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

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

我正在尝试从 C#.NET 中使用此签名从 C++ 程序集(无法访问源代码)中调用一个方法

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 不是结构数组。它是一个 指针 结构的数组。

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

像这样从数组中读取不透明指针值:

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

这得到第ith个值。