Как вы можете маршалировать массив байтов в C #? - PullRequest
7 голосов
/ 06 августа 2010

Я пытаюсь вызвать следующую функцию C ++, которая заключена в DLL:

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 Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.

Мне просто интересно, заключается ли ошибка в том, как я марширую свои данные или в импортированный файл DLL ... у кого-нибудь есть идеи?

Ответы [ 3 ]

2 голосов
/ 06 августа 2010

Это, вероятно, происходит, потому что соглашение о вызове метода не так, как это предполагал маршаллер. Вы можете указать соглашение в атрибуте DllImport.

Вам не нужно ключевое слово «unsafe» в объявлении C #, поскольку это не «небезопасный» код. Возможно, вы пытались сделать это с фиксированным указателем в одной точке и забыли удалить ключевое слово unsafe перед публикацией?

1 голос
/ 19 апреля 2013

не уверен, что это ваша проблема, но в целом указатели C ++ отображаются на IntPtr.поэтому попробуйте изменить оператор импорта следующим образом:

[DllImport("mex_rectify_image.dll")]
unsafe public static extern IntPtr rectifyImage(
IntPtr pData, int rows, int columns);
0 голосов
/ 23 сентября 2013

rectifyImage Ищет ponter для 1-го байта в блоке для данных, которые вы отправляете в блоке. Попробуйте imageData [0]

...