本文主要是介绍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]; //储存处理好的Queryfor (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转化即可;
这篇关于c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!