[System.Runtime.InteropServices.DllImportAttribute("visual_pick.dll", SetLastError = true)] public static extern int start(); [System.Runtime.InteropServices.DllImportAttribute("visual_pick.dll", SetLastError = true)] public static extern int stop(); [System.Runtime.InteropServices.DllImportAttribute("visual_pick.dll", SetLastError = true)] public static extern IntPtr getInfo(); [System.Runtime.InteropServices.DllImportAttribute("visual_pick.dll", SetLastError = true)] public static extern int getInfoSize();
调用名字需要跟c++中函数名一致,结构体类型使用指针接收(IntPtr),对应调用代码和实体定义如下:
public void GetObjectInfo() { try { //获取结构体字节大小 var size = Marshal.SizeOf(typeof(pickObjectInfoType)); //获取个数 var pickSize = getInfoSize(); if (pickSize > 0) { //获取对应方法内存地址,调用方法获取对应方法得到数组内存地址 var infosIntptr = getInfo(); for (int inkIndex = 0; inkIndex < pickSize; inkIndex++) { //根据获取内存地址进行数据偏移计算,得到对应指针指向的内存地址 IntPtr ptr = (IntPtr)(infosIntptr.ToInt64() + (inkIndex * size)); //根据内存地址转换结构体获取数据 pickList.Add((pickObjectInfoType)Marshal.PtrToStructure(ptr, typeof(pickObjectInfoType))); Marshal.FreeHGlobal(ptr); } } } catch (Exception ex) { throw new Exception(ex.Message); } }
[StructLayout(LayoutKind.Sequential)] public struct pickObjectInfoType { public float x; public float y; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]//对应c++类型字节数,c++需要用char* 数组定义此类型 public string z; }