代码如下:
const int FILE_MAP_WRITE = 0x0002; const int FILE_MAP_READ = 0x0004; IntPtr m_hSharedMemoryFile = IntPtr.Zero; IntPtr m_pwData = IntPtr.Zero; bool m_bAlreadyExist = false; bool m_bInit = false; long m_MemSize = 0; public ShareMem() { } ~ShareMem() { Close(); } /// <summary> /// 初始化共享内存 /// </summary> /// <param name="strName">共享内存名称</param> /// <param name="lngSize">共享内存大小</param> /// <returns></returns> public int Init(string strName, long lngSize) { if (lngSize <= 0 || lngSize > 64000 * 1024) lngSize = 64000 * 1024;//0x00800000 65536(64KB) m_MemSize = lngSize; if (strName.Length > 0) { //创建内存共享体(INVALID_HANDLE_VALUE) m_hSharedMemoryFile = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, (uint)PAGE_READWRITE, 0, (uint)lngSize, strName); if (m_hSharedMemoryFile == IntPtr.Zero) { m_bAlreadyExist = false; m_bInit = false; return 2; //创建共享体失败 } else { if (GetLastError() == ERROR_ALREADY_EXISTS) //已经创建 { m_bAlreadyExist = true; } else //新创建 { m_bAlreadyExist = false; } } //SYSTEM_INFO systemInfo = new SYSTEM_INFO(); ; //GetSystemInfo(ref systemInfo); ////得到系统页分配粒度 //uint allocationGranularity = systemInfo.dwAllocationGranularity; } else { return 1; //参数错误 } return 0; //创建成功 } /// <summary> /// 关闭共享内存 /// </summary> public void Close() { if (m_bInit) { UnmapViewOfFile(m_pwData); CloseHandle(m_hSharedMemoryFile); } } /// <summary> /// 读数据 /// </summary> /// <param name="bytData">数据</param> /// <param name="lngAddr">起始地址</param> /// <param name="lngSize">个数</param> /// <returns></returns> public int Read(ref byte[] bytData, int lngAddr, int lngSize) { if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区 //--------------------------------------- //创建内存映射 m_pwData = MapViewOfFile(m_hSharedMemoryFile, FILE_MAP_READ, 0, 0, (uint)lngSize); if (m_pwData == IntPtr.Zero) { m_bInit = false; CloseHandle(m_hSharedMemoryFile); return 3; //创建内存映射失败 } else { m_bInit = true; if (m_bAlreadyExist == false) { //初始化 } } //---------------------------------------- if (m_bInit) { Marshal.Copy(m_pwData, bytData, lngAddr, lngSize); UnmapViewOfFile(m_pwData); } else { return 1; //共享内存未初始化 } return 0; //读成功 } /// <summary> /// 写数据 /// </summary> /// <param name="bytData">数据</param> /// <param name="lngAddr">起始地址</param> /// <param name="lngSize">个数</param> /// <returns></returns> public int Write(byte[] bytData, int lngAddr, int lngSize) { if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区 //--------------------------------------- //创建内存映射 m_pwData = MapViewOfFile(m_hSharedMemoryFile, FILE_MAP_WRITE, 0, 0, (uint)lngSize); if (m_pwData == IntPtr.Zero) { m_bInit = false; CloseHandle(m_hSharedMemoryFile); return 3; //创建内存映射失败 } else { m_bInit = true; if (m_bAlreadyExist == false) { //初始化 } } //---------------------------------------- if (m_bInit) { Marshal.Copy(bytData, lngAddr, m_pwData, lngSize); UnmapViewOfFile(m_pwData); } else { return 1; //共享内存未初始化 } return 0; //写成功 }
lngSize比较小的时候完全没有问题,
但是我有一个DataTable有10MB,
序列化为byte[] 数组初始化成功之后再Read or Write
这时内存映射文件就无法创建成功了
我的电脑是2G的内存,
求解。。。。。。。。。。。。。。。。。。
GetLastError
创建失败后调用看看返回值
@沧海一杰: 返回值等于5 怎么解决啊
@alone__: 我也百度了下,好像是【5】-拒绝访问。你不行了谷哥吧,用E文找一找看看。
@沧海一杰: google半天了,没找到解决办法, E文是啥,
对了,你有这方面的例子吗,
开始:
Init lngSize是从0开始慢慢增加到10M
Read or Write lngSize也是从0开始慢慢增加到10M
修改之后:
Init 的时候我把lngSize=64M
Read or Write 的时候lngSize从0开始慢慢增加到10M
这样就能创建成功了
因为我的应用程序是WebForm 每次使用之前都需要
调用Init方法,在去Read or Write