Как вы можете маршалировать массив байтов в C #?

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

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

7
задан FabianCook 21 July 2013 в 20:50
поделиться

1 ответ

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

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

.
2
ответ дан 7 December 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: