结构体数组指针,C++带有指针数组的结构体转换为C#可用的结构体的方法

如果您有疑问或建议,请进入技术讨论区交流 >>>
C++带有指针数组的结构体转换为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的成员访问,就方便多了
Tags:  结构体数组赋值 结构体数组定义 结构体数组初始化 结构体数组 结构体数组指针

延伸阅读

最新评论

发表评论