我用你的代码验证了一下我的猜测。
有两处错误
1 c++的dll 方法:int GetVehiclesInfo(VehicleInfo *pVehicle, int size);
参数是指针数组 应该使用 VehicleInfo **pVehicle
所以应该为int GetVehiclesInfo(VehicleInfo **pVehicle, int size);
DLL中的方法 为了测试加了一个MessageBoxA
VEC_API int GetVehiclesInfo(VehicleInfo **pVehicle, int size)
{
for(int i =0;i { pVehicle[i]->vehicle_name[0]='H'; pVehicle[i]->vehicle_name[1]='A'; pVehicle[i]->vehicle_name[2]='U'; pVehicle[i]->vehicle_name[3]='0'; pVehicle[i]->vehicle_name[4]='9'; pVehicle[i]->vehicle_name[5]='8'; pVehicle[i]->idx=1; pVehicle[i]->vehicle_rtsp[0]='1'; pVehicle[i]->vehicle_rtsp[1]='2'; } string s(pVehicle[0]->vehicle_rtsp); MessageBoxA(NULL,pVehicle[0]->vehicle_name,"pVehicle[0]的车牌号码是",0); return 0; } 2 c# record[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(BwsPtzManager.VehicleInfo)) * isize); 像这样分配地址是不对的 ,这样只是给record[0] 分配了 record[size] 长度地址空间 而并没有给 record[1]~ record[size-1]分配空间 所以应该为 IntPtr[] record = new IntPtr[isize]; //申请内存空间 for (int i = 0; i < isize; i++) { record[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VehicleInfo))); } 按钮事件: private void button1_Click(object sender, EventArgs e) { int isize=5; IntPtr[] record = new IntPtr[isize]; //申请内存空间 for (int i = 0; i < isize; i++) { record[i] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VehicleInfo))); } int realcount = GetVehiclesInfo(record, isize); for (int i = 0; i < realcount; i++) { VehicleInfo vehinfo = new VehicleInfo(); vehinfo = (VehicleInfo)Marshal.PtrToStructure((IntPtr)((UInt32)record[i]), typeof(VehicleInfo)); Marshal.FreeHGlobal(record[i]); } } [DllImport("vec.dll", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int GetVehiclesInfo( IntPtr[] p, int size);
你只申请了record[0]的空间,1~isize的空间没有申请,使用使为默认值(null)肯定出问题了