作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试调用以下封装到 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);
但是,我不断收到运行时错误:
System.AccessViolationException
类型的第一次机会异常发生在 xxx.dll 中尝试读取或写入 protected 内存。这通常表明其他内存已损坏。
我只是想知道错误是出在我整理数据的方式上还是出在我导入的 DLL 文件中……有人有任何想法吗?
最佳答案
这很可能发生,因为该方法的调用约定与编码器所猜测的不同。您可以在 DllImport 属性中指定约定。
您不需要在此处的 C# 声明中使用“不安全”关键字,因为它不是“不安全”代码。也许您曾在某一时刻使用“固定”指针进行尝试,而忘记在发布前删除不安全关键字?
关于c# - 如何在 C# 中编码(marshal)字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426491/
我是一名优秀的程序员,十分优秀!