Передача байтового массива из C # в C ++ com-объект с массивом заполнения C ++ - PullRequest
0 голосов
/ 08 февраля 2012

Мне нужно передать байтовый массив в C ++ com-объект из C #. Затем C ++ заполнит буфер для чтения C #.

определение функции c ++

STDMETHODIMP CSampleGrabber::GetBuffer(byte* bd)
{
    int p=0;
    while (p< nBufSize) {
        bd[p]=pLocalBuf[p];
        p++;
    }

c # код:

byte[] byTemp = new byte[nBufSize];      
igb.GetBuffer(ref byTemp);

Это приводит к сбою программы без исключения. Пожалуйста, может кто-нибудь помочь. Спасибо

РЕШИТЬ:

с

byte[] byTemp = new byte[nBufSize];

GCHandle h = GCHandle.Alloc(byTemp, GCHandleType.Pinned); 
igb.GetBuffer(h.AddrOfPinnedObject());

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Параметр не должен быть объявлен как ref.Вы хотите что-то вроде:

uint GetBuffer(byte[] bd);

Если вы включите ref, вы передаете указатель на массив, когда вы просто хотите массив.(И под массивом я имею в виду указатель на первый элемент.)

0 голосов
/ 17 июня 2015

Я знаю, что это старый вопрос, но Google привел меня сюда, чтобы он мог привлечь кого-то еще. Если вы используете P / Invoke для вызова:

... GetBuffer(byte* bd)

это должно выглядеть примерно так:

[DllImport("MyDll.dll")]
... GetBuffer(ref byte bd);

И буферный массив в c # должен передаваться следующим образом:

var arr = new byte[Length];
GetBuffer(ref arr[0]);

Это также работает с char*, так как вы можете просто передать ту же самую ссылку на массив byte и затем использовать string s = Encoding.<encoding>.GetString(arr);

...