Re[2]: #pragma pack(push,1) - как сделать в С#?
От: Spirit_1 Россия  
Дата: 05.12.08 05:43
Оценка:
Здравствуйте, vdimas, Вы писали:

V>А смысл делать FileMapping, если тебе для прочтения любого поля будет маршаллиться т.е. долго и нудно копироваться вся структура, да еще и через рефлексию? Автоматический маршаллинг убъет нафик любой выигрыш от FileMapping.


Придумал такой вариант без маршаллинга, но в unsafe:

        [StructLayout(LayoutKind.Sequential, Pack = 1)] // Pack=1 тоже жизненно необходимо, по умолчанию выравнивается вроде по 4 байта или определяется платформой

        unsafe struct RateInfo
        {
            uint ctm;
            double open;
            double low;
            double high;
            double close;
            double vol;
            public fixed char copyright[64]; // ну или как там у вас...
        }

//... а в соответствующей процедуре так:
                byte[] buf = new byte[sizeof(RateInfo)];
                GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned);
                FileStream fs = new FileStream("infile");
                fs.Read(buf, 0, buf.Length);                           // ну или как то иначе заполняем
                RateInfo* ptr = (RateInfo*)handle.AddrOfPinnedObject().ToPointer();
//дальше поля структуры доступны через операцию ->

// а когда все закрывается и уничтожается не забыть освободить указатель
                handle.Free();


Ну естественно, все это лучше обернуть в аккуратно написанный класс И никакого маршаллинга и лишнего копирования, а тем более процедур отражения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.