Пример #1
0
        /// <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);
            }
        }
Пример #2
0
 /// <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);
     }
 }