В настоящее время для доставки структуры из 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 #.
Импортируйте свою функцию 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);
Других решений пока нет …