![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| zss |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
есть простая структура на C++
я передаю ее через сокет и получаю массив byte[]. мне приходится создавать промежеточную структуру
преобразовывать массив байт к ней
а потом руками заполнять поля S2
тоже и в обратную сторону. Есть ли способ сразу получить из S -> S2 и из S2 -> S ? |
||||||||
|
|||||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Можно, если заюзать не unsafe а обычную структуру с атрибутом [StructLayout(LayoutKind.Explicit)] и над массивом поставить [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
-------------------- ![]() |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Вот код, с кое-какими поправками от первого совета
SomeDll.cpp
Program.cs
-------------------- ![]() |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
а сразу в string нельзя ? только в byte[]
|
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
кстати есть еще типичная несовместимость типов
например bool в C++ 1 байт, а в C# 4 байта. Можно ли это тоже уровнять ? |
|||
|
||||
| Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
С чего ты взял? bool в C# тоже 1 байт. 100%.
Добавлено @ 11:26 Да и вообще, если увидишь в каком-либо языке программирования, что экземпляр типа true\false, больше 1 байта, можешь сразу бросать этот язык. Думаю, ты понимаешь, почему. -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
It is true. Но храниться в стеке как 4 байта (последние 3 пустые) Добавлено @ 11:37 Naum, бросай C# |
|||
|
||||
| Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Упс. Так я еще толком и не начинал. -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Размер bool-поля структуры можно задать тем же самым [MarshalAs(UnmanagedType.I1)]. Также можно поюзать [StructLayout(LayoutKind.Explicit)] в паре с [FieldOffset(смещение_в_байтах)] над полями.
-------------------- ![]() |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
mr.DUDA, а что за I1?
и спасибо за помощь во всех моих темах З.Ы. У меня складывается впечатление, что ты знаещь какую-то волшебную книгу по C# раз столько знаний. Поделись названием Добавлено @ 23:11 З.Ы.Ы. кстати все эти MarshalAs сохраняются только на следующую строку или можно на все структуру сразу задать ? |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
zss, технология и язык достаточно простые, чтобы освоить за полгода. Всё упирается в опыт использования конкретных вещей.
На каждое поле в отдельности. -------------------- ![]() |
|||
|
||||
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
странно, то после этих изменений перестал выполняться код
я сделал так
теперь слетает при попытке определить размер int size = Marshal.SizeOf(obj); и говорит, что
З.Ы. Кстати маршалинг также не работает если это не структура, а класс. Почему ? |
||||
|
|||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Строку нельзя маршаллизировать как массив. Для строк есть отдельный тип маршаллизации: ByValTStr. К тому же, не мешало бы указать что структура выровнена по границам 1 байта, а для строк используется charset ANSI (1 байт на символ):
Работает. -------------------- ![]() |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
блин... если библиотека под Compact FW, то многое недоступно. Например CharSet.Ansi и Pack. Что же все так сложно-то. Почему такая несовместимость ? Добавлено @ 13:09 Хотя в MSDN говориться что это доступнов CF2.0 но компилятор говорит
Это сообщение отредактировал(а) zss - 3.12.2006, 13:16 |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Покажи что за класс. З.Ы. про Compact Framework лучше не спрашивать -------------------- ![]() |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
возникла еще проблемма - неправильно работает
Marshal.PtrToStructure до массива все нормально, а при первом byte[] все сбивается Что ему опять не так ? |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
с этим вроде разобрался (моя ошибка
жаль только в CF не работает CharSet и Pack и не получилось маршалить классы Если не сложно - есть еще вопросики к специалистам маршалинга 1. Сокер работает с массивами byte[]. Приходится преобразовывать структуру к массиву, читать в него, а потом обратно гнать в структуру. Это не очень удобно. Можно ли как сказать, что структура есть массив байт. А сколько ее размер - пусть считает (или на крайний случай самому говорить размер) 2. Можно ли как читать не всю структуру, а например только ее первые N полей |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
1 - нет
2 - нет Побори свою лень -------------------- ![]() |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Чтоб маршалило классы - надо либо поставить [Serializable], либо наследовать от MarshalByRefObject
-------------------- ![]() |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
||||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Взято из вопросов по ремоутингу: первое даст возможность передававать объект из одного аппдомена в другой по значению, а второе - по ссылке (с прокси). Ты говоришь о маршаллинге - мой ответ как раз о маршаллинге. Заметь, не о сериализации или записи объекта в стрим; а именно о передаче из одного контекста в другой (из одного аппдомена в другой, из одного процесса в другой).
-------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |