我正在尝试调用包含在DLL中的以下C ++函数:
unsigned char * rectifyImage(unsigned char *pimg, int rows, int cols)
我的导入语句如下所示:
[DllImport("mex_rectify_image.dll")]
unsafe public static extern IntPtr rectifyImage(
byte[] data, int rows, int columns);
我的通话程序如下所示:
byte[] imageData = new byte[img.Height * img.Width * 3];
// ... populate imageData
IntPtr rectifiedImagePtr = rectifyImage(imageData, img.Height, img.Width);
Byte[] rectifiedImage = new Byte[img.Width * img.Height * 3];
Marshal.Copy(rectifiedImagePtr, rectifiedImage, 0, 3 * img.Width * img.Height);
但是,我一直收到运行时错误:
xxx.dll中出现System.AccessViolationException
类型的第一次机会异常
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
我只是想知道问题是否在于我正在整理我的数据或导入的DLL文件......任何人都有任何想法?
答案 0 :(得分:2)
这很可能发生,因为该方法的调用约定并不像编组人员猜测的那样。您可以在DllImport属性中指定约定。
这里的C#声明中不需要'unsafe'关键字,因为它不是'不安全'代码。也许你在一个点上尝试使用“固定”指针并忘记在发布之前删除不安全的关键字?
答案 1 :(得分:1)
不确定这是否是您的问题,但通常C ++指针映射到IntPtr。所以尝试将import语句修改为:
[DllImport("mex_rectify_image.dll")]
unsafe public static extern IntPtr rectifyImage(
IntPtr pData, int rows, int columns);
答案 2 :(得分:0)
纠正图像正在寻找指向块中第1个字节的指针,用于在块中发送的数据。试试imageData [0]