Привет, коллеги.
Кто разобрался, как правильно работать в современном Core.Net с MMF?
Ну, то есть очевидная идея: есть MMF в винде. Есть их
официальная поддержка в дотнете.
С другой стороны, у нас тут теперь есть модный API по allocation-free работе с памятью, в виде Span<T> и прочих его друзей из System.Memory.
И вот тут у меня затык: как подружить одно с другим?
Предположим примитивный случай: у меня есть полностью unmanaged структура. Например, long.
И есть файл размером в 10GB, целиком покрытый экземплярами этой структуры.
Я хочу работать с этим файлом в терминах Span<long>/ReadOnlySpan<long>.
Проблема номер 1: даже для того, чтобы добраться до указателя, который можно было бы скормить в конструктор спана, мне приходится делать неприличные unsafe-приседания типа AcquirePointer()
Проблема номер 2: я так и не понял, а как вообще пользоваться MMF в терминах прямых указателей? Решительно неясно, в какой момент надо вызывать ReleasePointer — см.
https://stackoverflow.com/questions/52576962/what-is-the-correct-way-to-dispose-of-safememorymappedviewhandle-when-acquirepoi
Ответ там меня реально анноит: "You cannot make this safe, so no real point in trying."
Мне казалось, что решения со Span<T> и прочим должны уметь обеспечивать нужную безопасность.
Может, всё же можно накрутить какую-то ref struct вокруг MemoryMappedViewAccessor так, чтобы он мог отдавать Span<> для работы ниже по стеку?