Комментарии 6
Union можно эмулировать через [StructLayout(LayoutKind.Explicit)] и [FieldOffset(0)]. И быстрый конвертер таким образом получить. А сами структуры входящие в этот «union» должны быть [StructLayout(LayoutKind.Sequential), Pack = 1] чтоб пробелов не было. Пока проблем не замечено.
+8
А если не указывать расширение библиотеки, получится кросс-платформенно с минимумом усилий.[DllImport("libip4tc.so")]
В C# структуры по умолчанию LayoutKind.Sequential. Впрочем, можно всё равно указывать для дополнительной ясности.[StructLayout(LayoutKind.Sequential)] public struct IptEntry
Размер реализации вычисляется как Marshal.SizeOf<IptEntry>()
По возможности используйте sizeof().Тем не менее при работе с сетевыми адресами и номерами портов может понадобиться обратный порядок байт. Для знаковых типов есть готовый метод. Для беззнаковых типов снимать проклятье придется самим:В принципе, если полей в big endian много, можно скастовать custom marshaler, чтобы он переворачивал байтики вместо вызывающего кода.
0
Интересно, в .net можно сделать naked-фунцию? (Функцию, которая не делает предположений о том, как выглядит стек). Такие функции нужны при написании обработчиков прерываний.
0
Занимательно. С помощью C++/CLI решать подобные задачи не пробовали? ИМХО, много легче и понятнее…
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Путешествие в unmanaged code: туда и обратно