来源:http://bbs.youkuaiyun.com/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转化即可;