Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Маршалинг структур


Автор: VovanNumberOne 26.4.2010, 17:56
Всем привет!

Имеется струкрута в которой помимо всего имеются:
1) Ansi строки которые передаются туда по значению.
Строки нуль-детерминированные и длина их динамическая, соответсвенно в атрибут [MarshalAs()] нельзя прописать ни UnmanagedType.ByValTStr ни UnmanagedType.AnsiBStr, так как байта-префикса с длинной нету :(
2) В той же структуре есть ещё и другие строки (тоже by value, без указателей), которые наоборот не нуль-детерминированы, но имеют префикс с длинной строки, только этот префик не однобайтный а 4-байтный (int) :wall:

Как провести марашализацию такой структуры?

Ничего не гуглится... Есть только аналогичные вопросы и без ответа: (Гляньте если мой краткий вопрос вам не понятен, мне надо такое http://www.codeguru.com/forum/showthread.php?t=454610 )

Я попробовал сделать свой Маршаллер от ICustomMarshaler, пишу для поля в структуре атрибут
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(MyMarshaler))]
и при запуске выяснёется страшное, что нельзя почему-то использовать свои маршаллеры для полей структур.

Что делать??? Писать свой маршаллер для всей здоровой структуры??? Кажется только это и остаётся.
Очень нужна помощь!

P.S.
Исходников dll у меня конечно нет, и я честно не знаю кто её писал и чем он руководствовался делая такие странные нестандартные параметры и структуры. :wall:
Но написать обёртку к ней без unsafe и ручной переборки байтов очень очень нужно! 

Автор: jonie 27.4.2010, 08:06
используйте C++/CLR . написал пример для вашего случая (в аттаче) ( ну только сделаете библиотеку с классом и методами ConvertTo и ConvertFrom например и будет вам счастие)

Автор: VovanNumberOne 27.4.2010, 17:41
Спасибо большое!
Пригодится и это.
Но мне пришлось реализовать свой CustomMarshaling для всех структуры целиком, побайтно распределяя данные.
Так как структура очень не подъемная была, очень большая вложенность и размер ~60 Кб. Я бы ваше решение на С++ очень долго бы дорабатывал для такого.... Всё равно спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)