来自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#中解决这个问题?
答案 0 :(得分:2)
values
不是struct数组。它是struct的指针数组。
根据评论和查看代码,您似乎没有结构本身的定义。这就是所谓的不透明指针。您不需要知道结构大小,只需处理指向结构的指针,然后将其传递回库中。
从数组中读取不透明指针值,如下所示:
IntPtr Value = Marshal.ReadIntPtr(values_report.values, i*IntPtr.Size);
这获得了i th 值。