Одна проблема заключается в том, что маршаллер не может определить, сколько элементов находится в возвращаемом массиве, что означает, что он не может его маршалировать.
Есть ли у API PerformQuery () какой-то другой способ определениядлина массива?
Если он только когда-либо возвращает 1 элемент, вы можете заставить его вернуть IntPtr, а затем использовать Marshal.PtrToStructure (), как описано здесь:
p/ вызывать функцию C, которая возвращает указатель на структуру
Обновление:
Вы можете использовать такой интерфейс C, например, одну функцию, которая возвращает количество элементов, и одну, которая заполняетпредварительно выделенный массив с элементами.
extern "C" _declspec(dllexport) int GetQueryNumItems();
extern "C" _declspec(dllexport) void GetQueryItems(DeviceList* items);
Тогда определение C # будет выглядеть так:
[DllImport("BT_Conn.dll")]
public extern static int GetQueryNumItems();
[DllImport("BT_Conn.dll")]
public extern static void GetQueryItems([In, Out] DeviceList[] items);
И вы бы назвали это в C # следующим образом:
int numItems = GetQueryNumItems();
DeviceList[] items = new DeviceList[numItems];
GetQueryItems(items);
При взаимодействии C # и C ++ мне обычно легче создавать библиотеку классов C ++ / CLI, которая предоставляет управляемый интерфейс для переноса кода C в смешанную DLL.Однако эта опция может быть недоступна, если вы работаете на CE.