C#共享内存操作类具体的是如何实现的呢?C#共享内存操作类需要注意什么呢?那么本文就向你详细介绍这方面的内容。
C#同享内存操作是怎么完成的呢?VC++的同享内存操作代码完成起来相对比较简单,可是用C#言语来完成,就有必定难度,因为工作需要,把曾经VC开发的同享内存代码要用C#完成,甭说,还费了不少曲折,究竟C#操作API函数和地址指针不是那么直接,还好,总算完成了,作用还不错。
C#同享内存操作类实例:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Text;
- usingSystem.Runtime.InteropServices;
- namespaceShareMemLib
- {
- publicclassShareMem
- {
- [DllImport("user32.dll",CharSet=CharSet.Auto)]
- publicstaticexternIntPtrSendMessage(IntPtrhWnd,
- intMsg,intwParam,IntPtrlParam);
- [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
- publicstaticexternIntPtrCreateFileMapping(
- inthFile,IntPtrlpAttributes,uintflProtect,
- uintdwMaxSizeHi,uintdwMaxSizeLow,stringlpName);
- [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
- publicstaticexternIntPtrOpenFileMapping(
- intdwDesiredAccess,
- [MarshalAs(UnmanagedType.Bool)]boolbInheritHandle,stringlpName);
- [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
- publicstaticexternIntPtrMapViewOfFile(IntPtr
- hFileMapping,uintdwDesiredAccess,
- uintdwFileOffsetHigh,uintdwFileOffsetLow,
- uintdwNumberOfBytesToMap);
- [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
- publicstaticexternboolUnmapViewOfFile(IntPtrpvBaseAddress);
- [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
- publicstaticexternboolCloseHandle(IntPtrhandle);
- [DllImport("kernel32",EntryPoint="GetLastError")]
- publicstaticexternintGetLastError();
- constintERROR_ALREADY_EXISTS=183;
- constintFILE_MAP_COPY=0x0001;
- constintFILE_MAP_WRITE=0x0002;
- constintFILE_MAP_READ=0x0004;
- constintFILE_MAP_ALL_ACCESS=0x0002|0x0004;
- constintPAGE_READONLY=0x02;
- constintPAGE_READWRITE=0x04;
- constintPAGE_WRITECOPY=0x08;
- constintPAGE_EXECUTE=0x10;
- constintPAGE_EXECUTE_READ=0x20;
- constintPAGE_EXECUTE_READWRITE=0x40;
- constintSEC_COMMIT=0x8000000;
- constintSEC_IMAGE=0x1000000;
- constintSEC_NOCACHE=0x10000000;
- constintSEC_RESERVE=0x4000000;
- constintINVALID_HANDLE_VALUE=-1;
- IntPtrm_hSharedMemoryFile=IntPtr.Zero;
- IntPtrm_pwData=IntPtr.Zero;
- boolm_bAlreadyExist=false;
- boolm_bInit=false;
- longm_MemSize=0;
- publicShareMem()
- {
- }
- ~ShareMem()
- {
- Close();
- }
- ///﹤summary﹥
- ///初始化同享内存
- ///﹤/summary﹥
- ///﹤paramname="strName"﹥同享内存称号﹤/param﹥
- ///﹤paramname="lngSize"﹥同享内存大小﹤/param﹥
- ///﹤returns﹥﹤/returns﹥
- publicintInit(stringstrName,longlngSize)
- {
- if(lngSize﹤=0||lngSize﹥0x00800000)lngSize=0x00800000;
- 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;
- return2;//创立同享体失利
- }
- else
- {
- if(GetLastError()==ERROR_ALREADY_EXISTS)//现已创立
- {
- m_bAlreadyExist=true;
- }
- else//新创立
- {
- m_bAlreadyExist=false;
- }
- }
- //---------------------------------------
- //创立内存映射
- m_pwData=MapViewOfFile(m_hSharedMemoryFile,
- FILE_MAP_WRITE,0,0,(uint)lngSize);
- if(m_pwData==IntPtr.Zero)
- {
- m_bInit=false;
- CloseHandle(m_hSharedMemoryFile);
- return3;//创立内存映射失利
- }
- else
- {
- m_bInit=true;
- if(m_bAlreadyExist==false)
- {
- //初始化
- }
- }
- //----------------------------------------
- }
- else
- {
- return1;//参数过错
- }
- return0;//创立成功
- }
- ///﹤summary﹥
- ///封闭同享内存
- ///﹤/summary﹥
- publicvoidClose()
- {
- if(m_bInit)
- {
- UnmapViewOfFile(m_pwData);
- CloseHandle(m_hSharedMemoryFile);
- }
- }
- ///﹤summary﹥
- ///读数据
- ///﹤/summary﹥
- ///﹤paramname="bytData"﹥数据﹤/param﹥
- ///﹤paramname="lngAddr"﹥开始地址﹤/param﹥
- ///﹤paramname="lngSize"﹥个数﹤/param﹥
- ///﹤returns﹥﹤/returns﹥
- publicintRead(refbyte[]bytData,
- intlngAddr,intlngSize)
- {
- if(lngAddr+lngSize﹥m_MemSize)return2;
- //超出数据区
- if(m_bInit)
- {
- Marshal.Copy(m_pwData,bytData,lngAddr,lngSize);
- }
- else
- {
- return1;//同享内存未初始化
- }
- return0;//读成功
- }
- ///﹤summary﹥
- ///写数据
- ///﹤/summary﹥
- ///﹤paramname="bytData"﹥数据﹤/param﹥
- ///﹤paramname="lngAddr"﹥开始地址﹤/param﹥
- ///﹤paramname="lngSize"﹥个数﹤/param﹥
- ///﹤returns﹥﹤/returns﹥
- publicintWrite(byte[]bytData,intlngAddr,intlngSize)
- {
- if(lngAddr+lngSize﹥m_MemSize)return2;//超出数据区
- if(m_bInit)
- {
- Marshal.Copy(bytData,lngAddr,m_pwData,lngSize);
- }
- else
- {
- return1;//同享内存未初始化
- }
- return0;//写成功
- }
- }
- }
C#同享内存操作类实例测验例程:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.ComponentModel;
- usingSystem.Data;
- usingSystem.Drawing;
- usingSystem.Text;
- usingSystem.Windows.Forms;
- usingShareMemLib;
- namespaceYFShareMem
- {
- publicpartialclassfrmShareMem:Form
- {
- ShareMemMemDB=newShareMem();
- publicfrmShareMem()
- {
- InitializeComponent();
- }
- privatevoidbtnOpen_Click(objectsender,EventArgse)
- {
- if(MemDB.Init("YFMemTest",10240)!=0)
- {
- //初始化失利
- MessageBox.Show("初始化失利");
- }
- else
- {
- btnOpen.Enabled=false;
- chkWrite.Enabled=true;
- tmrTime.Enabled=true;
- }
- }
- privatevoidtmrTime_Tick(objectsender,EventArgse)
- {
- byte[]bytData=newbyte[16];
- intintRet=MemDB.Read(refbytData,0,16);
- lstData.Items.Clear();
- if(intRet==0)
- {
- for(inti=0;i﹤16;i++)
- {
- lstData.Items.Add(bytData[i].ToString());
- }
- if(chkWrite.Checked)
- {
- bytData[0]++;
- bytData[1]+=2;
- if(bytData[0]﹥200)bytData[0]=0;
- if(bytData[1]﹥200)bytData[1]=0;
- MemDB.Write(bytData,0,16);
- }
- }
- }
- }
- }
C#同享内存操作类的基本内容就向你介绍到这儿,期望对你了解和学习C#同享内存操作类有所协助。
【修改引荐】
- C#操作文本文件使用实例简析
- C#操作文本文件演练实例浅析
- C#操作内存之指针浅析
- C#操作内存读写办法浅析
- C#操作内存实例详解
转载请说明出处
知优网 » C#同享内存操作类实例浅析(C#共享内存)
知优网 » C#同享内存操作类实例浅析(C#共享内存)