带有指针数组的结构体不能直接转换为C#类型的结构体,转换起来有点麻烦
先定义出对应C++类型的C#结构体
public struct user_group_t
{
public int id;
public string name;
}
public struct user_group_list
{
public int group_array_count;
public IntPtr group_array;//指向 user_group_t类型的指针
}
泛型函数实现转换功能
public static List<T> MarshalPtrToStructArray<T>(IntPtr p, int count)
{
List<T> l = new List<T>();
for (int i = 0; i < count; i++, p = new IntPtr(p.ToInt32() + Marshal.SizeOf(typeof(T))))
{
T t = (T)Marshal.PtrToStructure(p, typeof(T));
l.Add(t);
}
return l;
}
调用方式
通常C++函数返回一个指向user_group_list类型的指针,在C#中可使用IntPtr ptrGroupList对应指针,
而user_group_list类型结构体内包含的内容是长度为 group_array_count,地址为 group_array 的数组
因为IntPtr不能如C++的指针一样进行 ptrGroupList++这样的操作,所以要访问其内部成员需要把它转换为数组或list
使用Marshal.PtrToStructure把指向结构体的指针转换为具体的结构体
user_group_list tructList = (user_group_list)Marshal.PtrToStructure(ptrStructGroupList, typeof(user_group_list));
再使用泛型转换函数实现转换
List<user_group_t> listGroupTemp = MarshalPtrToStructArray<user_group_t>(structList.group_array, structList.group_array_count);
对于list的成员访问,就方便多了
欢迎大家提出更多更方便的转换方式