| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .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 Кб. Я бы ваше решение на С++ очень долго бы дорабатывал для такого.... Всё равно спасибо! |