C#共享内存操作类具体的是如何实现的呢?C#共享内存操作类需要注意什么呢?那么本文就向你详细介绍这方面的内容。

C#同享内存操作是怎么完成的呢?VC++的同享内存操作代码完成起来相对比较简单,可是用C#言语来完成,就有必定难度,因为工作需要,把曾经VC开发的同享内存代码要用C#完成,甭说,还费了不少曲折,究竟C#操作API函数和地址指针不是那么直接,还好,总算完成了,作用还不错。

C#同享内存操作类实例浅析(C#共享内存)  C#共享内存 第1张

C#同享内存操作类实例:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. usingSystem.Runtime.InteropServices;
  5. namespaceShareMemLib
  6. {
  7. publicclassShareMem
  8. {
  9. [DllImport("user32.dll",CharSet=CharSet.Auto)]
  10. publicstaticexternIntPtrSendMessage(IntPtrhWnd,
  11. intMsg,intwParam,IntPtrlParam);
  12. [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
  13. publicstaticexternIntPtrCreateFileMapping(
  14. inthFile,IntPtrlpAttributes,uintflProtect,
  15. uintdwMaxSizeHi,uintdwMaxSizeLow,stringlpName);
  16. [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
  17. publicstaticexternIntPtrOpenFileMapping(
  18. intdwDesiredAccess,
  19. [MarshalAs(UnmanagedType.Bool)]boolbInheritHandle,stringlpName);
  20. [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
  21. publicstaticexternIntPtrMapViewOfFile(IntPtr
  22. hFileMapping,uintdwDesiredAccess,
  23. uintdwFileOffsetHigh,uintdwFileOffsetLow,
  24. uintdwNumberOfBytesToMap);
  25. [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
  26. publicstaticexternboolUnmapViewOfFile(IntPtrpvBaseAddress);
  27. [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
  28. publicstaticexternboolCloseHandle(IntPtrhandle);
  29. [DllImport("kernel32",EntryPoint="GetLastError")]
  30. publicstaticexternintGetLastError();
  31. constintERROR_ALREADY_EXISTS=183;
  32. constintFILE_MAP_COPY=0x0001;
  33. constintFILE_MAP_WRITE=0x0002;
  34. constintFILE_MAP_READ=0x0004;
  35. constintFILE_MAP_ALL_ACCESS=0x0002|0x0004;
  36. constintPAGE_READONLY=0x02;
  37. constintPAGE_READWRITE=0x04;
  38. constintPAGE_WRITECOPY=0x08;
  39. constintPAGE_EXECUTE=0x10;
  40. constintPAGE_EXECUTE_READ=0x20;
  41. constintPAGE_EXECUTE_READWRITE=0x40;
  42. constintSEC_COMMIT=0x8000000;
  43. constintSEC_IMAGE=0x1000000;
  44. constintSEC_NOCACHE=0x10000000;
  45. constintSEC_RESERVE=0x4000000;
  46. constintINVALID_HANDLE_VALUE=-1;
  47. IntPtrm_hSharedMemoryFile=IntPtr.Zero;
  48. IntPtrm_pwData=IntPtr.Zero;
  49. boolm_bAlreadyExist=false;
  50. boolm_bInit=false;
  51. longm_MemSize=0;
  52. publicShareMem()
  53. {
  54. }
  55. ~ShareMem()
  56. {
  57. Close();
  58. }
  59. ///﹤summary﹥
  60. ///初始化同享内存
  61. ///﹤/summary﹥
  62. ///﹤paramname="strName"﹥同享内存称号﹤/param﹥
  63. ///﹤paramname="lngSize"﹥同享内存大小﹤/param﹥
  64. ///﹤returns﹥﹤/returns﹥
  65. publicintInit(stringstrName,longlngSize)
  66. {
  67. if(lngSize﹤=0||lngSize﹥0x00800000)lngSize=0x00800000;
  68. m_MemSize=lngSize;
  69. if(strName.Length﹥0)
  70. {
  71. //创立内存同享体(INVALID_HANDLE_VALUE)
  72. m_hSharedMemoryFile=CreateFileMapping(
  73. INVALID_HANDLE_VALUE,IntPtr.Zero,
  74. (uint)PAGE_READWRITE,0,(uint)lngSize,strName);
  75. if(m_hSharedMemoryFile==IntPtr.Zero)
  76. {
  77. m_bAlreadyExist=false;
  78. m_bInit=false;
  79. return2;//创立同享体失利
  80. }
  81. else
  82. {
  83. if(GetLastError()==ERROR_ALREADY_EXISTS)//现已创立
  84. {
  85. m_bAlreadyExist=true;
  86. }
  87. else//新创立
  88. {
  89. m_bAlreadyExist=false;
  90. }
  91. }
  92. //---------------------------------------
  93. //创立内存映射
  94. m_pwData=MapViewOfFile(m_hSharedMemoryFile,
  95. FILE_MAP_WRITE,0,0,(uint)lngSize);
  96. if(m_pwData==IntPtr.Zero)
  97. {
  98. m_bInit=false;
  99. CloseHandle(m_hSharedMemoryFile);
  100. return3;//创立内存映射失利
  101. }
  102. else
  103. {
  104. m_bInit=true;
  105. if(m_bAlreadyExist==false)
  106. {
  107. //初始化
  108. }
  109. }
  110. //----------------------------------------
  111. }
  112. else
  113. {
  114. return1;//参数过错
  115. }
  116. return0;//创立成功
  117. }
  118. ///﹤summary﹥
  119. ///封闭同享内存
  120. ///﹤/summary﹥
  121. publicvoidClose()
  122. {
  123. if(m_bInit)
  124. {
  125. UnmapViewOfFile(m_pwData);
  126. CloseHandle(m_hSharedMemoryFile);
  127. }
  128. }
  129. ///﹤summary﹥
  130. ///读数据
  131. ///﹤/summary﹥
  132. ///﹤paramname="bytData"﹥数据﹤/param﹥
  133. ///﹤paramname="lngAddr"﹥开始地址﹤/param﹥
  134. ///﹤paramname="lngSize"﹥个数﹤/param﹥
  135. ///﹤returns﹥﹤/returns﹥
  136. publicintRead(refbyte[]bytData,
  137. intlngAddr,intlngSize)
  138. {
  139. if(lngAddr+lngSize﹥m_MemSize)return2;
  140. //超出数据区
  141. if(m_bInit)
  142. {
  143. Marshal.Copy(m_pwData,bytData,lngAddr,lngSize);
  144. }
  145. else
  146. {
  147. return1;//同享内存未初始化
  148. }
  149. return0;//读成功
  150. }
  151. ///﹤summary﹥
  152. ///写数据
  153. ///﹤/summary﹥
  154. ///﹤paramname="bytData"﹥数据﹤/param﹥
  155. ///﹤paramname="lngAddr"﹥开始地址﹤/param﹥
  156. ///﹤paramname="lngSize"﹥个数﹤/param﹥
  157. ///﹤returns﹥﹤/returns﹥
  158. publicintWrite(byte[]bytData,intlngAddr,intlngSize)
  159. {
  160. if(lngAddr+lngSize﹥m_MemSize)return2;//超出数据区
  161. if(m_bInit)
  162. {
  163. Marshal.Copy(bytData,lngAddr,m_pwData,lngSize);
  164. }
  165. else
  166. {
  167. return1;//同享内存未初始化
  168. }
  169. return0;//写成功
  170. }
  171. }
  172. }

C#同享内存操作类实例测验例程:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.ComponentModel;
  4. usingSystem.Data;
  5. usingSystem.Drawing;
  6. usingSystem.Text;
  7. usingSystem.Windows.Forms;
  8. usingShareMemLib;
  9. namespaceYFShareMem
  10. {
  11. publicpartialclassfrmShareMem:Form
  12. {
  13. ShareMemMemDB=newShareMem();
  14. publicfrmShareMem()
  15. {
  16. InitializeComponent();
  17. }
  18. privatevoidbtnOpen_Click(objectsender,EventArgse)
  19. {
  20. if(MemDB.Init("YFMemTest",10240)!=0)
  21. {
  22. //初始化失利
  23. MessageBox.Show("初始化失利");
  24. }
  25. else
  26. {
  27. btnOpen.Enabled=false;
  28. chkWrite.Enabled=true;
  29. tmrTime.Enabled=true;
  30. }
  31. }
  32. privatevoidtmrTime_Tick(objectsender,EventArgse)
  33. {
  34. byte[]bytData=newbyte[16];
  35. intintRet=MemDB.Read(refbytData,0,16);
  36. lstData.Items.Clear();
  37. if(intRet==0)
  38. {
  39. for(inti=0;i﹤16;i++)
  40. {
  41. lstData.Items.Add(bytData[i].ToString());
  42. }
  43. if(chkWrite.Checked)
  44. {
  45. bytData[0]++;
  46. bytData[1]+=2;
  47. if(bytData[0]﹥200)bytData[0]=0;
  48. if(bytData[1]﹥200)bytData[1]=0;
  49. MemDB.Write(bytData,0,16);
  50. }
  51. }
  52. }
  53. }
  54. }

C#同享内存操作类的基本内容就向你介绍到这儿,期望对你了解和学习C#同享内存操作类有所协助。

【修改引荐】

  1. C#操作文本文件使用实例简析
  2. C#操作文本文件演练实例浅析
  3. C#操作内存之指针浅析
  4. C#操作内存读写办法浅析
  5. C#操作内存实例详解
转载请说明出处
知优网 » C#同享内存操作类实例浅析(C#共享内存)

发表评论

您需要后才能发表评论