Размер управляемых структур

.NET 4.0 Платформы представляет классы для чтения и записи файлов с отображенной памятью. Классы центрируются вокруг методов для чтения и записи структур. Они не упорядочиваются, но копируются от и до файла в форме, в которой они размечаются в управляемой памяти.

Скажем, я хочу записать две структуры последовательно в файл с отображенной памятью с помощью этих методов:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Foo
{
    public char C;
    public bool B;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct Bar
{
}

static void Write(T1 item1, T2 item2)
    where T1 : struct
    where T2 : struct
{
    using (MemoryMappedFile file = MemoryMappedFile.CreateNew(null, 32))
    using (MemoryMappedViewAccessor accessor = file.CreateViewAccessor())
    {
        accessor.Write(0L, ref item1);  //  <-- (1)
        accessor.Write(??, ref item2);  //  <-- (2)
    }
}

static void Main()
{
    Foo foo = new Foo { C = 'α', B = true };
    Bar bar = new Bar { };
    Write(foo, bar);
}

Как я получил бы число байтов, записанных в (1), таким образом, я могу записать следующее значение рядом в (2)?

Примечание: Число байтов в примере равняется 3 (=2+1), не 5 (=1+4), как возвращено Маршалом. SizeOf.

Примечание 2: sizeof не может определить размер универсальных параметров типа.

12
задан dtb 24 January 2010 в 16:25
поделиться

1 ответ

кажется, что нет никакого зарегистрированной/общественности способа получить доступ к внутреннему функция SizeOfType, используемая класс MemoryMappedViewAccessor , таким образом, самый практический способ получить размер тех структур состоял бы в том, чтобы использовать отражение как это:

static readonly Func<Type, uint> SizeOfType = (Func<Type, uint>)Delegate.CreateDelegate(typeof(Func<Type, uint>), typeof(Marshal).GetMethod("SizeOfType", BindingFlags.NonPublic | BindingFlags.Static));

static void Write<T1, T2>(T1 item1, T2 item2)
    where T1 : struct
    where T2 : struct
{
    using (MemoryMappedFile file = MemoryMappedFile.CreateNew(null, 32))
    using (MemoryMappedViewAccessor accessor = file.CreateViewAccessor())
    {
        accessor.Write(0, ref item1);
        accessor.Write(SizeOfType(typeof(T1)), ref item2);
    }
}
4
ответ дан 2 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: