Как стать автором
Обновить

Комментарии 6

Union можно эмулировать через [StructLayout(LayoutKind.Explicit)] и [FieldOffset(0)]. И быстрый конвертер таким образом получить. А сами структуры входящие в этот «union» должны быть [StructLayout(LayoutKind.Sequential), Pack = 1] чтоб пробелов не было. Пока проблем не замечено.
[DllImport("libip4tc.so")]
А если не указывать расширение библиотеки, получится кросс-платформенно с минимумом усилий.

[StructLayout(LayoutKind.Sequential)]
public struct IptEntry
В C# структуры по умолчанию LayoutKind.Sequential. Впрочем, можно всё равно указывать для дополнительной ясности.

Размер реализации вычисляется как Marshal.SizeOf<IptEntry>()
По возможности используйте sizeof().

Тем не менее при работе с сетевыми адресами и номерами портов может понадобиться обратный порядок байт. Для знаковых типов есть готовый метод. Для беззнаковых типов снимать проклятье придется самим:
В принципе, если полей в big endian много, можно скастовать custom marshaler, чтобы он переворачивал байтики вместо вызывающего кода.

Интересно, в .net можно сделать naked-фунцию? (Функцию, которая не делает предположений о том, как выглядит стек). Такие функции нужны при написании обработчиков прерываний.

Занимательно. С помощью C++/CLI решать подобные задачи не пробовали? ИМХО, много легче и понятнее…
Импорт so-шек Вас не смутил? Как запустить C++/CLI на не-windows платформах?
О как, не знал. Печально: чего полезного не хватишься — того и нету(
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации