Я использую функцию из 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);
Любая помощь приветствуется, большое спасибо.