Здравствуйте, vog, Вы писали:
vog>Как бы мне эти алигменты указать в C#? Массив таких структур записан в файле, я хочу использовать
vog>FileMapping и читать, как массив структур, наверное, без указания алигмента не обойтись?
А смысл делать FileMapping, если тебе для прочтения любого поля будет маршаллиться т.е. долго и нудно копироваться вся структура, да еще и через рефлексию?

Автоматический маршаллинг убъет нафик любой выигрыш от FileMapping.
Сделай обертку типа такого:
unsafe struct RateInfo
{
private byte* _addr;
public RateInfo(IntPtr addr) {
_addr = addr.ToPointer();
}
uint Ctm { get { return *(uint*)_addr; } }
double Open { get { return *(double*)(_addr+4); } }
double Low { get { return *(double*)(_addr+12); } }
...
}
Структура хранит адрес элемента, с которым работаешь, а в св-вах ручками пишем код, который нам нарисовал бы какой-нить C++/CLI-компилятор при обращении к полям твоей исходной структуры, т.е. будет работать с нативной скоростью без проседания быстродействия в сотню раз на маршаллинге.
Идеально было бы сделать это всё не ручками, а создать вспомогательную либу именно в упомянутом C++/CLI, дабы сохранить принцип реализации, но убрать нелицеприятный хардкод.
Принцип там будет примерно такой:
#pragma unmanaged
#pragma (push, пиф, паф и что угодно из С++)
struct NativeRateInfo {
unsigned ctm;
...
};
#pragma managed
public value class RateInfo {
NativeRateInfo* ptr;
public:
RateInfo(NativeRateInfo* p) : ptr(p) {}
// :)
void Next() { ptr++; }
unsigned Ctm { unsigned get() { return ptr.ctm; } }
...
};
... << RSDN@Home 1.2.0 alpha rev. 786>>