Как передать структуру из C ++ в C # с минимальной задержкой? (без сортировки?)

В настоящее время для доставки структуры из c ++ в c # я объявляю ее с обеих сторон (c ++ и c #) и использую делегат. Этот подход описан Вот. На мой взгляд, для приложений с низкой задержкой это может быть неуместно, поскольку маршалинг / демаршаллинг расходует ресурсы процессора и памяти и может повлиять на производительность, когда размер структуры достаточно велик, частота запросов достаточно высока, а требования к задержке достаточно высоки.

Для таких сценариев с низкой задержкой было бы лучше не выделять дополнительную память, а работать непосредственно с памятью c ++ в c #. Я обнаружил, что один проект использует System.IO.UnmanagedMemoryStream а также System.IO.BinaryReader для этого некоторые поля можно прочитать, например, так:

reader = new System.IO.BinaryReader(stream);
stream.Position = 8;
return reader.ReadInt32();

Однако я не могу найти полный пример (как иметь UnmanagedMemoryStream в C #, который указывает на некоторую структуру или массив структур в C ++?) Я не уверен, что это лучший подход, но это может быть так. Что бы вы предложили для переноса структур с низкой задержкой из c ++ в c #? Не могли бы вы привести пример?

Меня не волнует переносимость, ремонтопригодность и т. Д. Важно только время ожидания. Это временное решение, пока я не избавлюсь от c #.

2

Решение

Импортируйте свою функцию C ++ и сделайте так, чтобы она возвращала структуру в качестве параметра. В C # используйте тип IntPtr и используйте

DllImport("somedll.dll")
public static extern void SomeFunction(out IntPtr someStructParameterOutput);

А потом:

IntPtr yourStruct;
SomeFunction(out yourStruct);
Stream s = new UnmanagedMemoryStream((byte*)yourStruct.ToPointer(), length);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]