S>Кажется, там используют свой костыль — BytesToStruct. Почему —
, подозрение на кривое объявление структур.
S>Также можно глянуть на http://rilnet.codeplex.com/ (по ссылке из csdn). Рядом — ссылка на http://www.developerfusion.com/article/84519/mastering-structs-in-c
Да вот я сейчас и пытаюсь этот костыль подпилить... А в рилнете реализовано всё, кроме RILMESSAGE

(
Добрый день.
Есть структура
http://msdn.microsoft.com/en-us/library/aa919458.aspx
Интересует именно UNION так как DWORD можно заменить на UInt32, а как реализовать UNION я не знаю...
Помогите её реализовать на C#.
Здравствуйте, vasiliy535, Вы писали:
V>Есть структура http://msdn.microsoft.com/en-us/library/aa919458.aspx
V>Интересует именно UNION так как DWORD можно заменить на UInt32, а как реализовать UNION я не знаю...
V>Помогите её реализовать на C#.
By using attributes you can customize how structs are laid out in memory. For example, you can create what's known as a union in C/C++ by using the StructLayout(LayoutKind.Explicit) and FieldOffset attributes.
здесь
Здравствуйте, vasiliy535, Вы писали:
V>Помогите её реализовать на C#.
В принципе, всё понятно
Также:
You should wait for notification message — RILMESSAGE.
http://msdn.microsoft.com/en-us/library/aa919458.aspx
But managed code is not suitable for this task, C++ is a better option.
And obligatory disclaimer — RIL is not intended for use by application developers and Microsoft (probably) refuse any support. 
Здравствуйте, Sinix, Вы писали:
В принципе, всё понятно
Да, я пробовал использовать то, что предлагается в этой ссылке. Но тогда на моменте
RILMESSAGE msg = (RILMESSAGE)Marshal.PtrToStructure(lpData, typeof(RILMESSAGE));
вываливается ексепшн "NotSupportedException"...
В с++ я не силен, поэтому и пытаюсь реализовать на шарпе.
Здравствуйте, vasiliy535, Вы писали:
V>вываливается ексепшн "NotSupportedException"...
Кажется, там используют свой костыль — BytesToStruct. Почему —

, подозрение на кривое объявление структур.
Также можно глянуть на
http://rilnet.codeplex.com/ (по ссылке из csdn). Рядом — ссылка на
http://www.developerfusion.com/article/84519/mastering-structs-in-c/
Здравствуйте, vasiliy535, Вы писали:
V>Да вот я сейчас и пытаюсь этот костыль подпилить... А в рилнете реализовано всё, кроме RILMESSAGE
(
Marshal не сможет её обработать, и это понятно, у него нет способа выяснить, какая из веток объединения актуальна. Потому надо маршалить вручную. Насколько я понял при беглом взгляде, там актуальная ветвь определяется константой в поле
DWORD dwType. Эта RILMESSAGE ведь всегда по ссылке передаётся? Я-бы сделал её классом и написал к ней маршалер, который записывал-бы в буфер две независимые структуры, сначала ту, которая описывала-бы неизменную часть RILMESSAGE, а затем — одну из структур, описывающих каждую ветвь отдельно. Таким образом, маршалинг/демаршалинг будут состоять из двух вызовов Marshal.PtrToStructure/Marshal.StructureToPtr. Там есть ещё буферы фиксированного размера, возможно их тоже следует вынести из деклараций структур, чтобы избавиться от unsafe.
Здравствуйте, vasiliy535, Вы писали:
S>>Кажется, там используют свой костыль — BytesToStruct. Почему —
, подозрение на кривое объявление структур.
S>>Также можно глянуть на http://rilnet.codeplex.com/ (по ссылке из csdn).
V>Да вот я сейчас и пытаюсь этот костыль подпилить... А в рилнете реализовано всё, кроме RILMESSAGE
(
Как вариант — маршалить через атрибуты просто как IntPtr, т.е. функция вернет голый указатель.
Потом Marshal.ReadInt32 — считываем размер структуры.
Остальное можно либо считывать по мере надобности через те же методы Marshal.ReadXXX, либо через промежуточный блок — выделяем массив для оставшихся данных, копируем туда байтики через Marshal.Copy, над массивом создаем MemoryStream и читаем себе спокойно оттуда.