Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маршалинг 
V
    Опции темы
registered
Дата 14.9.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 30.8.2006

Репутация: 1
Всего: 1



пусть есть простая структура
Код

    public struct S
    {
        public uint a1;
        public uint a2;
        ...
    };


есть функция преобразования
Код

        static public byte[] ToBytes(object obj)
        {
            int size = Marshal.SizeOf(obj);
            IntPtr ptr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(obj, ptr, false);
            byte[] buffer = new byte[size];
            Marshal.Copy(ptr, buffer, 0, size);
            Marshal.FreeHGlobal(ptr);
            return buffer;
        }


почему со структурой она работает нормально, а если описать ее как класс - не может вычислить размер
Код

An unhandled exception of type 'System.ArgumentException' occurred in test.dll

Additional information: Type 'test.S' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed


странно - с точки зрения объекта - это одно и тоже

PM MAIL   Вверх
Kefir
Дата 14.9.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 2
Всего: 87



RTFM
Цитата

This method accepts an instance of a structure, which can be a reference type or a boxed value type. The layout must be sequential or explicit.


Код

[StructLayout(LayoutKind.Sequential)]
class MyClassForMarshalSizeOf
{
  public int myVar1;
  public int myVar2;
}

в общем так должно будет работать.

Это сообщение отредактировал(а) Kefir - 14.9.2006, 23:56
PM MAIL WWW Skype   Вверх
registered
Дата 21.9.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 30.8.2006

Репутация: 1
Всего: 1



странно - но появилась еще одна проблемма. На всех структурах описанных ранее все работало

но создал класс
Код

    public enum TIME_TYPE{...};
    public enum RANGE {...};


    [StructLayout(LayoutKind.Sequential)]
    public class Header
    {
        public RANGE range;
        public byte b1;
        public byte b2;
        public TIME_TYPE time_type;
        public ushort time;
        public byte count;
    };

    [StructLayout(LayoutKind.Sequential)]
    public class State : Header
    {
        public byte[] ch;
    };


то при использовании
Код

                    State state = new State();
                    Header header = (Header)state;
                    byte[] m_buffer = ToBytes(header);


вываливает
Код

error CS0118: 'ToBytes(object)' is a 'method' but is used like a 'type'


что это значит ?
PM MAIL   Вверх
Kefir
Дата 21.9.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 2
Всего: 87



А собственно откуда ToBytes берётся?
PM MAIL WWW Skype   Вверх
registered
Дата 21.9.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 30.8.2006

Репутация: 1
Всего: 1



Цитата(Kefir @  21.9.2006,  17:28 Найти цитируемый пост)
А собственно откуда ToBytes берётся? 


Kefir, с этим вроде разобрался - мой косяк smile (ToBytes я априводил в первом посте)


но осталась одна проблемма c наследованием
Код

State state = new State();
Header header = (Header)state;
byte[] buffer = Utils.ToBytes(header);


то слетает на 
Код

int size = Marshal.SizeOf(obj);


тоесть либо не помогла твоя подсказка для классов
Код

[StructLayout(LayoutKind.Sequential)]


либо так нельзя делать для наследованных классов. Или еще что ?
PM MAIL   Вверх
Kefir
Дата 21.9.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 2
Всего: 87



извини, я не понял - что значит "слетает на"?


Цитата(registered @  21.9.2006,  12:52 Найти цитируемый пост)

тоесть либо не помогла твоя подсказка для классов

Цитата(registered @  21.9.2006,  12:52 Найти цитируемый пост)
либо так нельзя делать для наследованных классов.

очень странно. я хоть сам и не пробовал, но вроде ("по идее") должно работать...
PM MAIL WWW Skype   Вверх
registered
Дата 21.9.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 30.8.2006

Репутация: 1
Всего: 1



Цитата(Kefir @  21.9.2006,  21:12 Найти цитируемый пост)
очень странно. я хоть сам и не пробовал, но вроде ("по идее") должно работать... 

не помогло.

Переделал класс под структуру - все заработало
Цитата(Kefir @  21.9.2006,  21:12 Найти цитируемый пост)
извини, я не понял - что значит "слетает на"?

Exception вываливает
PM MAIL   Вверх
Kefir
Дата 21.9.2006, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 2
Всего: 87



Гм... если уж пошла такая пьянка, то попробуй Explicit вместо Sequential. Не уверен, что оно станет работать, но попробовать стоит.
PM MAIL WWW Skype   Вверх
arbuzov
Дата 21.9.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.9.2006

Репутация: 1
Всего: 1



Цитата(registered @  14.9.2006,  19:21 Найти цитируемый пост)
почему со структурой она работает нормально, а если описать ее как класс - не может вычислить размер

потому что все классы это ссылочные типы(указатель в 4 байта ни больше не меньше длz win32, если интересно smile), а структуры передаются по значению(копируются значения и размер вычислить не проблем )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.2108 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.