c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)


来源:http://bbs.csdn.net/topics/380165851


依靠以下文章:解决问题。


、、、、、、、、、、、、、、、、、、、、

可以用Marshal.StruectToPtr哦。


、、、、、、、、、、、、、、

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct Query
        {
            public String Address;
            public Int32 Port;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public String User;
        }

        public class LibWrap
        {
            //这里通过值传递指针数组,C++中不能改变数组大小
            //如需要此功能,可通过引用传递指针数组后再作处理(以IntPtr传递数组首地址)
            [DllImport("MyDll.dll")]
            public static extern void GetResult([In, Out] IntPtr[] array, Int32 size);
        }

        static void Main(string[] args)
        {
            const int PointersCount = 11;    //指针数量

            IntPtr[] arrPointer = new IntPtr[PointersCount];

            //在C++中为每一个Query结构分配内存,并将指针赋入从C#传入的指针数组中
            LibWrap.GetResult(arrPointer, PointersCount);

            Query[] arrQuery = new Query[PointersCount];    //储存处理好的Query
            for (int i=0;i<PointersCount;i++)
            {
                //arrQuery[i] = (Query)(Marshal.PtrToStructure(arrPointer[i], typeof(Query)));
                Marshal.PtrToStructure(arrPointer[i], arrQuery[i]);
                Console.WriteLine("Query{0}: Address {1}, Port {2}, User {3}", i, arrQuery[i].Address, arrQuery[i].Port, arrQuery[i].User);
            }
            Console.ReadKey();
        }


、、、、、、、、、、、、、、、、、、、、、、、

直接用IntPtr作为参数传入就可以了;

数组在内存中是顺序存储的,调用方法后IntPtr参数返回的是数组第一个值的地址;
所以,数组第N个元素的地址为IntPtr + N * sizeof(struct);
得到数组元素的地址后,用Marshal.PtrToStructure转化即可;








阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭