Здравствуйте, vasiliy535, Вы писали:
V>Да вот я сейчас и пытаюсь этот костыль подпилить... А в рилнете реализовано всё, кроме RILMESSAGE
(
Marshal не сможет её обработать, и это понятно, у него нет способа выяснить, какая из веток объединения актуальна. Потому надо маршалить вручную. Насколько я понял при беглом взгляде, там актуальная ветвь определяется константой в поле
DWORD dwType. Эта RILMESSAGE ведь всегда по ссылке передаётся? Я-бы сделал её классом и написал к ней маршалер, который записывал-бы в буфер две независимые структуры, сначала ту, которая описывала-бы неизменную часть RILMESSAGE, а затем — одну из структур, описывающих каждую ветвь отдельно. Таким образом, маршалинг/демаршалинг будут состоять из двух вызовов Marshal.PtrToStructure/Marshal.StructureToPtr. Там есть ещё буферы фиксированного размера, возможно их тоже следует вынести из деклараций структур, чтобы избавиться от unsafe.