Как я могу передать байтовый массив по ссылке с c# на C ++ - PullRequest
0 голосов
/ 11 апреля 2020

Я использую функцию из c ++ .dll из C#. .Dll частично документирован, он был создан для считывания результатов из базы данных результатов. Функция имеет следующую сигнатуру:

cdb_get(int index, int kwh, int kwl, void *s, int *ls, int nrew);

Во многих случаях я знаю структуру данных, которые я читаю, поэтому я могу просто создать структуру с правильным форматом и прочитать ее, используя обычный pInvoke.

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

[DllImport("name_of_dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int cdb_get(
   int index,
   int kwh,
   int kwl,
   ref byte[] data,
   ref int dataLen,
   int pos);

Но, похоже, это не сработает (это теоретически?). Есть ли способ заставить эту работу работать с байтовым массивом и передавать его по ссылке?

Пока я работаю над этим, используя IntPtr, а затем выполняю маршалинг вручную. Мне нужно угадать размер указателя, хотя, я думаю, это неизбежно? Есть ли другой способ справиться с сортировкой?

    IntPtr data = Marshal.AllocHGlobal(128);
    int size = 128;
    int returnValue = cdbGet(index, kwh, kwl, data, ref size, 1);
    byteArray = new byte[size];
    Marshal.Copy(data, byteArray, 0, size);
    Marshal.FreeHGlobal(data);

Любая помощь приветствуется, большое спасибо.

1 Ответ

1 голос
/ 15 апреля 2020

Не могу оставить комментарий, поэтому пишу сюда. Это похоже на ваш вопрос, оно может вам помочь.

...