Comments 10
Я давно бы уже перешёл с C++ на C#, если бы не работа со структурами.
Вот за этот способ конечно спасибо (уж очень он лаконичен):
[StructLayout(LayoutKind.Sequential, Pack=1)]
Но массивы байтов к указателю на структуру кастовать всё-равно проблематично (unsafe и все такое).
А что именно смущает в работе со структурами? Я сам пишу часть dll пишу на С++ CLI, но это из-за требований производительности и общения с нативным С++ кодом.
Как только начинаю кастовать массив байтов к структуре и обращаться к полям из всех щелей лезут unsafe. Часто приходится работать с сетевыми данными (заголовки сетевых протоколов).
Не могу сказать, что статья была для меня чем-нибудь полезна, но за труд спасибо.
интересно, а почему компилятор не пробует сам изменить порядок следования полей в структуре, чтоб упаковка была оптимальной?
Он как раз это и делает, если не указать атрибут [StructLayout(LayoutKind.Sequential)]. Проблема в том, что оптимальная упаковка может не совпадать с требованиями к выравниванию полей структуры, передаваемой по ссылке в неуправляемые функции.
Отличная статья!
А не подскажите ли вы, как в C# правильно читать «null-terminated string sequence»
что в памяти выглядит примерно так:
some text\0another text\0some more text\0\0

Используется это в DRIVER_INFO_3 структуре, переменная pDependentFiles (winspool.drv), размер не фиксированный и нигде не обозначен.
msdn.microsoft.com/en-us/library/dd162503%28VS.85%29.aspx

К сожалению когда я с этим столкнулся, как бы я не пытался, не смог найти способ определить размер буффера с коллекцие строк.
Пришлось использовать цикл в котором считывал до встречи второго \0, что я считаю крайне не безопасно…

Во всех примерах работы с этой стркутурой, я столкнулся что они считают как string без всяких замарочек, что приводит к большим проблемам т.к. оно считывает до первого \0 и дальше пропускает в лучшем случае.
Only those users with full accounts are able to leave comments. Log in, please.