C++代码如下:
struct DLL_DepthPoint
{
float x;
float y;
float z;
float noise;
uint16_t grayValue;
uint8_t depthConfidence; //!< value 0 = bad, 255 = good
};
typedef struct DLL_DEPTHDATA
{
int version;
long long timeStamp;
uint16_t width;
uint16_t height;
uint32_t* exposureTimes;
DLL_DepthPoint points[65535];
}DLL_DepthData;
DLL_GetRGBData(bool is_showGrey, DLL_DepthData *depth_data, unsigned char* rgb_buffer, int width, int height);
本人写的c#对应代码如下:
[StructLayout(LayoutKind.Sequential)]
public struct DLL_DepthPoint
{
public float x;
public float y;
public float z;
public float noise;
public UInt16 grayValue;
public byte depthConfidence;
};
[StructLayout(LayoutKind.Sequential)]
public struct DLL_DEPTHDATA
{
public int version;
public UInt32 timeStamp;
public UInt16 width;
public UInt16 height;
public IntPtr exposureTimes;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 38304)]
public DLL_DepthPoint[] points;
};
DLL_DEPTHDATA depthData = new SafeNativeMethods.DLL_DEPTHDATA();
DLL_DepthPoint[] point;point = new SafeNativeMethods.DLL_DepthPoint[38304];
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(64));
Marshal.StructureToPtr(depthData.exposureTimes, ptr, false);
depthData.points = point;
IntPtr ptrRsult = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SafeNativeMethods.DLL_DEPTHDATA)));
Marshal.StructureToPtr(depthData, ptrRsult, false);
DLL_GetRGBData(false, ref ptrRsult, ref rgb_buffer[0], 224, 171);
现在调用起来程序直接退出,AccessViolation, 不清楚哪里出了问题,试了好多种方式。
解决方案
100
1、long long对应c#的long而不是int
2、数组长度明明是65535,真不知道是不是你本人写的
2、数组长度明明是65535,真不知道是不是你本人写的