/// <summary> /// 指定されたファイル位置をメモリに割り当てる /// </summary> /// <param name="position">位置</param> /// <param name="byteCount">割り当てバイト数</param> /// <returns>メモリアドレス</returns> /// <remarks>割り当てられたメモリは使い終わったら ReleasePtr または ReleaseAllPtrs で開放する必要がある</remarks> public MemMapView AllocateView(ulong position, ulong byteCount) { if (this.FileSize < position + byteCount) { byteCount = this.FileSize - position; } ulong offset = position % AllocationGranularity; ulong mapPosition = position; if (offset != 0) { mapPosition -= offset; } unsafe { // 指定された位置をメモリにマッピング IntPtr viewAddress = MapViewOfFile(m_MappingHandle, m_FileMapAccess, (uint)(mapPosition >> 32), (uint)(mapPosition & 0xffffffff), new IntPtr((long)byteCount + (long)offset)); if (viewAddress == IntPtr.Zero) { throw new MemMapFileException(Marshal.GetLastWin32Error(), m_FileName); } // 取得されたポインタを保存 IntPtr address = new IntPtr((byte *)viewAddress.ToPointer() + offset); MemMapView v = new MemMapView(this, position, address, viewAddress, byteCount); m_Views.Add(address, v); return(v); } }
/// <summary> /// 割り当てられたメモリを開放する /// </summary> /// <param name="view">開放するビュー</param> public void ReleaseView(MemMapView view) { if (m_Views.ContainsKey(view.Address)) { if (!UnmapViewOfFile(m_Views[view.Address].ViewAddress)) { throw new MemMapFileException(Marshal.GetLastWin32Error(), m_FileName); } m_Views.Remove(view.Address); } }