.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
не может определить размер универсальных параметров типа.
кажется, что нет никакого зарегистрированной/общественности способа получить доступ к внутреннему функция 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);
}
}