如何在C#中编写一个字节数组?

时间:2010-08-06 18:06:59

标签: c# marshalling byte

我正在尝试调用包含在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文件......任何人都有任何想法?

3 个答案:

答案 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]