Конвертировать IntPtr в byte [] c # - PullRequest
1 голос
/ 23 ноября 2011

Я получаю IntPtr значение из метода библиотеки C ++, и мне нужно получить byte[] массив из этого полученного IntPtr.Когда я пытаюсь сделать это:

byte[] myArray = new byte[Marshal.SizeOf(myReceivedIntPtr)];
Marshal.Copy(myReceivedIntPtr, myArray, 0, Marshal.SizeOf(myReceivedIntPtr));

я получаю исключение: AccessViolationException.Что я пропустил?

EDIT :

Вот название метода и параметры в заголовке библиотеки C ++:

int MSR_DecodeTrack(char *AscBuff, unsigned char *BinBuff, unsigned char bpc, unsigned char parity, unsigned char ss, unsigned char es);

И я вызываю егоC # таким образом:

 UInt32 result;
 IntPtr myReceivedIntPtr;
 IntPtr BinBuff;
 byte BPC1 = 7, Parity1 = 1, SS1 = 0x05, ES1 = 0x1F;

 result = MSR_DecodeTrack(ref myReceivedIntPtr, ref BinBuff, BPC1, Parity1, SS1, ES1);

А вот еще код:

 byte[] myArray = new byte[Marshal.SizeOf(myReceivedIntPtr)];
 Marshal.Copy(myReceivedIntPtr, myArray, 0, Marshal.SizeOf(myReceivedIntPtr));

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Я почти уверен, что Marshal.SizeOf(myReceivedIntPtr) вернет размер объекта IntPtr, а не размер неуправляемого массива.Вам нужно будет получить размер неуправляемого массива из библиотеки c ++.

Мне не приходилось делать это какое-то время, поэтому я немного заржавел, но, глядя на заголовки c ++, я думаю, что этоожидает указатель на буфер.Вы даете ему указатель на указатель (intptr - указатель, и передача его по ссылке ref означает, что вы передаете код c ++ указателю на этот указатель).Во-первых, не используйте ref.Во-вторых, я подозреваю, что вы должны передавать ему буфер уже размера - есть ли документация, описывающая то, что вы должны передать функции?Какой код возврата у функции?Вы проверяете это на успех, не так ли?;)

0 голосов
/ 23 ноября 2011

Метод с именем MSR_DecodeTrack также должен возвращать длину каждого массива, который он выделяет.

Насколько я знаю, когда вы выделяете массив в среде C / C ++, вы получаете указатель на нулевой элемент этого массива, не более того. По этой причине вы также должны как-то вернуть длину выделенного массива обратно вызывающей стороне. Это можно сделать с помощью дополнительного параметра ref.

НТН.

...