如何在 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个值。
我正在尝试从 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个值。