C# помогите реализовтаь структуру (UNION)
От: vasiliy535  
Дата: 21.09.10 13:12
Оценка:
Добрый день.
Есть структура http://msdn.microsoft.com/en-us/library/aa919458.aspx
Интересует именно UNION так как DWORD можно заменить на UInt32, а как реализовать UNION я не знаю...
Помогите её реализовать на C#.
c# rilmessage union
Re: C# помогите реализовтаь структуру (UNION)
От: Arnx Россия  
Дата: 21.09.10 13:16
Оценка:
http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/60150e7b-665a-49a2-8e2e-2097986142f3
Re: C# помогите реализовтаь структуру (UNION)
От: _FRED_ Черногория
Дата: 21.09.10 13:20
Оценка:
Здравствуйте, 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.

здесь
Help will always be given at Hogwarts to those who ask for it.
Re: C# помогите реализовтаь структуру (UNION)
От: Sinix  
Дата: 21.09.10 13:34
Оценка:
Здравствуйте, 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.

Re[2]: C# помогите реализовтаь структуру (UNION)
От: vasiliy535  
Дата: 21.09.10 13:51
Оценка:
Здравствуйте, Sinix, Вы писали:

В принципе, всё понятно

Да, я пробовал использовать то, что предлагается в этой ссылке. Но тогда на моменте
RILMESSAGE msg = (RILMESSAGE)Marshal.PtrToStructure(lpData, typeof(RILMESSAGE));

вываливается ексепшн "NotSupportedException"...
В с++ я не силен, поэтому и пытаюсь реализовать на шарпе.
Re[3]: C# помогите реализовтаь структуру (UNION)
От: Sinix  
Дата: 21.09.10 14:06
Оценка:
Здравствуйте, vasiliy535, Вы писали:

V>вываливается ексепшн "NotSupportedException"...

Кажется, там используют свой костыль — BytesToStruct. Почему — , подозрение на кривое объявление структур.

Также можно глянуть на http://rilnet.codeplex.com/ (по ссылке из csdn). Рядом — ссылка на http://www.developerfusion.com/article/84519/mastering-structs-in-c/
Re[4]: C# помогите реализовтаь структуру (UNION)
От: vasiliy535  
Дата: 21.09.10 14:27
Оценка: +1
S>Кажется, там используют свой костыль — BytesToStruct. Почему — , подозрение на кривое объявление структур.
S>Также можно глянуть на http://rilnet.codeplex.com/ (по ссылке из csdn). Рядом — ссылка на http://www.developerfusion.com/article/84519/mastering-structs-in-c
Да вот я сейчас и пытаюсь этот костыль подпилить... А в рилнете реализовано всё, кроме RILMESSAGE (
Re[5]: C# помогите реализовтаь структуру (UNION)
От: Jolly Roger  
Дата: 22.09.10 03:01
Оценка:
Здравствуйте, vasiliy535, Вы писали:

V>Да вот я сейчас и пытаюсь этот костыль подпилить... А в рилнете реализовано всё, кроме RILMESSAGE (


Marshal не сможет её обработать, и это понятно, у него нет способа выяснить, какая из веток объединения актуальна. Потому надо маршалить вручную. Насколько я понял при беглом взгляде, там актуальная ветвь определяется константой в поле DWORD dwType. Эта RILMESSAGE ведь всегда по ссылке передаётся? Я-бы сделал её классом и написал к ней маршалер, который записывал-бы в буфер две независимые структуры, сначала ту, которая описывала-бы неизменную часть RILMESSAGE, а затем — одну из структур, описывающих каждую ветвь отдельно. Таким образом, маршалинг/демаршалинг будут состоять из двух вызовов Marshal.PtrToStructure/Marshal.StructureToPtr. Там есть ещё буферы фиксированного размера, возможно их тоже следует вынести из деклараций структур, чтобы избавиться от unsafe.
"Нормальные герои всегда идут в обход!"
Re[5]: C# помогите реализовтаь структуру (UNION)
От: Ocelot  
Дата: 22.09.10 20:33
Оценка:
Здравствуйте, vasiliy535, Вы писали:

S>>Кажется, там используют свой костыль — BytesToStruct. Почему — , подозрение на кривое объявление структур.

S>>Также можно глянуть на http://rilnet.codeplex.com/ (по ссылке из csdn).
V>Да вот я сейчас и пытаюсь этот костыль подпилить... А в рилнете реализовано всё, кроме RILMESSAGE (

Как вариант — маршалить через атрибуты просто как IntPtr, т.е. функция вернет голый указатель.
Потом Marshal.ReadInt32 — считываем размер структуры.
Остальное можно либо считывать по мере надобности через те же методы Marshal.ReadXXX, либо через промежуточный блок — выделяем массив для оставшихся данных, копируем туда байтики через Marshal.Copy, над массивом создаем MemoryStream и читаем себе спокойно оттуда.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.