C#共享内存操作类实例浅析

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

C#共享内存操作是如何实现的呢?VC++的共享内存操作代码实现起来相对比较容易,但是用C#语言来实现,就有一定难度,由于工作需要,把以前VC开发的共享内存代码要用C#实现,别说,还费了不少周折,毕竟C#操作API函数和地址指针不是那么直接,还好,总算完成了,效果还不错。

C#共享内存操作类实例 

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

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Runtime.InteropServices;  
  5.  
  6. namespace ShareMemLib  
  7. {  
  8. public class ShareMem  
  9. {  
  10. [DllImport("user32.dll", CharSet = CharSet.Auto)]  
  11. public static extern IntPtr SendMessage(IntPtr hWnd,   
  12. int Msg, int wParam, IntPtr lParam);  
  13.  
  14. [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  15. public static extern IntPtr CreateFileMapping(  
  16. int hFile, IntPtr lpAttributes, uint flProtect,   
  17. uint dwMaxSizeHi, uint dwMaxSizeLow, string lpName);  
  18.  
  19. [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  20. public static extern IntPtr OpenFileMapping(  
  21. int dwDesiredAccess,  
  22. [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,string lpName);  
  23.  
  24. [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  25. public static extern IntPtr MapViewOfFile(IntPtr   
  26. hFileMapping,uint dwDesiredAccess,  
  27.  uint dwFileOffsetHigh, uint dwFileOffsetLow,  
  28. uint dwNumberOfBytesToMap);  
  29.  
  30. [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  31. public static extern bool UnmapViewOfFile(IntPtr pvBaseAddress);  
  32.  
  33. [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]  
  34. public static extern bool CloseHandle(IntPtr handle);  
  35.  
  36. [DllImport("kernel32", EntryPoint="GetLastError")]  
  37. public static extern int GetLastError ();  
  38.  
  39. const int ERROR_ALREADY_EXISTS = 183;  
  40.  
  41. const int FILE_MAP_COPY = 0x0001;  
  42. const int FILE_MAP_WRITE = 0x0002;  
  43. const int FILE_MAP_READ = 0x0004;  
  44. const int FILE_MAP_ALL_ACCESS = 0x0002 | 0x0004;  
  45.  
  46. const int PAGE_READONLY = 0x02;  
  47. const int PAGE_READWRITE = 0x04;  
  48. const int PAGE_WRITECOPY = 0x08;  
  49. const int PAGE_EXECUTE = 0x10;  
  50. const int PAGE_EXECUTE_READ = 0x20;  
  51. const int PAGE_EXECUTE_READWRITE = 0x40;  
  52.  
  53. const int SEC_COMMIT = 0x8000000;  
  54. const int SEC_IMAGE = 0x1000000;  
  55. const int SEC_NOCACHE = 0x10000000;  
  56. const int SEC_RESERVE = 0x4000000;  
  57.  
  58. const int INVALID_HANDLE_VALUE = -1;  
  59.  
  60. IntPtr m_hSharedMemoryFile = IntPtr.Zero;  
  61. IntPtr m_pwData = IntPtr.Zero;  
  62. bool m_bAlreadyExist = false;  
  63. bool m_bInit = false;  
  64. long m_MemSize=0;  
  65.  
  66. public ShareMem()  
  67. {  
  68. }  
  69. ~ShareMem()  
  70. {  
  71. Close();  
  72. }  
  73.  
  74. /// ﹤summary﹥  
  75. /// 初始化共享内存  
  76. /// ﹤/summary﹥  
  77. /// ﹤param name="strName"﹥共享内存名称﹤/param﹥  
  78. /// ﹤param name="lngSize"﹥共享内存大小﹤/param﹥  
  79. /// ﹤returns﹥﹤/returns﹥  
  80. public int Init(string strName, long lngSize)  
  81. {  
  82. if (lngSize ﹤= 0 || lngSize ﹥ 0x00800000) lngSize = 0x00800000;  
  83. m_MemSize = lngSize;  
  84. if (strName.Length ﹥ 0)  
  85. {  
  86. //创建内存共享体(INVALID_HANDLE_VALUE)  
  87. m_hSharedMemoryFile = CreateFileMapping(  
  88. INVALID_HANDLE_VALUE, IntPtr.Zero,   
  89. (uint)PAGE_READWRITE, 0, (uint)lngSize, strName);  
  90. if (m_hSharedMemoryFile == IntPtr.Zero)  
  91. {  
  92. m_bAlreadyExist = false;  
  93. m_bInit = false;  
  94. return 2; //创建共享体失败  
  95. }  
  96. else 
  97. {  
  98. if (GetLastError() == ERROR_ALREADY_EXISTS)  //已经创建  
  99. {  
  100. m_bAlreadyExist = true;  
  101. }  
  102. else //新创建  
  103. {  
  104. m_bAlreadyExist = false;  
  105. }  
  106. }  
  107. //---------------------------------------  
  108. //创建内存映射  
  109. m_pwData = MapViewOfFile(m_hSharedMemoryFile,   
  110. FILE_MAP_WRITE, 0, 0, (uint)lngSize);  
  111. if (m_pwData == IntPtr.Zero)  
  112. {  
  113. m_bInit = false;  
  114. CloseHandle(m_hSharedMemoryFile);  
  115. return 3; //创建内存映射失败  
  116. }  
  117. else 
  118. {  
  119. m_bInit = true;  
  120. if (m_bAlreadyExist == false)  
  121. {  
  122. //初始化  
  123. }  
  124. }  
  125. //----------------------------------------  
  126. }  
  127. else 
  128. {  
  129. return 1; //参数错误   
  130. }  
  131.  
  132. return 0; //创建成功  
  133. }  
  134. /// ﹤summary﹥  
  135. /// 关闭共享内存  
  136. /// ﹤/summary﹥  
  137. public void Close()  
  138. {  
  139. if (m_bInit)  
  140. {  
  141. UnmapViewOfFile(m_pwData);  
  142. CloseHandle(m_hSharedMemoryFile);  
  143. }  
  144. }  
  145.  
  146. /// ﹤summary﹥  
  147. /// 读数据  
  148. /// ﹤/summary﹥  
  149. /// ﹤param name="bytData"﹥数据﹤/param﹥  
  150. /// ﹤param name="lngAddr"﹥起始地址﹤/param﹥  
  151. /// ﹤param name="lngSize"﹥个数﹤/param﹥  
  152. /// ﹤returns﹥﹤/returns﹥  
  153. public int Read(ref byte[] bytData,  
  154.  int lngAddr, int lngSize)  
  155. {  
  156. if (lngAddr + lngSize ﹥ m_MemSize) return 2;   
  157. //超出数据区  
  158. if (m_bInit)  
  159. {     
  160. Marshal.Copy(m_pwData, bytData, lngAddr, lngSize);  
  161. }  
  162. else 
  163. {  
  164. return 1; //共享内存未初始化  
  165. }  
  166. return 0; //读成功  
  167. }  
  168.  
  169. /// ﹤summary﹥  
  170. /// 写数据  
  171. /// ﹤/summary﹥  
  172. /// ﹤param name="bytData"﹥数据﹤/param﹥  
  173. /// ﹤param name="lngAddr"﹥起始地址﹤/param﹥  
  174. /// ﹤param name="lngSize"﹥个数﹤/param﹥  
  175. /// ﹤returns﹥﹤/returns﹥  
  176. public int Write(byte[] bytData, int lngAddr, int lngSize)  
  177. {  
  178. if (lngAddr + lngSize ﹥ m_MemSize) return 2; //超出数据区  
  179. if (m_bInit)  
  180. {  
  181. Marshal.Copy(bytData, lngAddr, m_pwData, lngSize);  
  182. }  
  183. else 
  184. {  
  185. return 1; //共享内存未初始化  
  186. }  
  187. return 0; //写成功  
  188. }  
  189. }  

C#共享内存操作类实例测试例程:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using ShareMemLib;  
  9.  
  10. namespace YFShareMem  
  11. {  
  12. public partial class frmShareMem : Form  
  13. {  
  14. ShareMem MemDB=new ShareMem();  
  15. public frmShareMem()  
  16. {  
  17. InitializeComponent();  
  18. }  
  19.  
  20. private void btnOpen_Click(object sender, EventArgs e)  
  21. {  
  22. if (MemDB.Init("YFMemTest", 10240) != 0)  
  23. {  
  24. //初始化失败  
  25. MessageBox.Show("初始化失败");  
  26. }  
  27. else 
  28. {  
  29. btnOpen.Enabled = false;  
  30. chkWrite.Enabled = true;  
  31. tmrTime.Enabled = true;  
  32. }  
  33. }  
  34.  
  35. private void tmrTime_Tick(object sender, EventArgs e)  
  36. {  
  37. byte[] bytData = new byte[16];  
  38. int intRet = MemDB.Read(ref bytData, 0, 16);  
  39. lstData.Items.Clear();   
  40. if (intRet == 0)  
  41. {  
  42. for (int i = 0; i ﹤ 16; i++)  
  43. {  
  44. lstData.Items.Add(bytData[i].ToString());  
  45. }  
  46.  
  47. if (chkWrite.Checked)  
  48. {  
  49. bytData[0]++;  
  50. bytData[1] += 2;  
  51. if (bytData[0] ﹥ 200) bytData[0] = 0;  
  52. if (bytData[1] ﹥ 200) bytData[1] = 0;  
  53. MemDB.Write(bytData, 0, 16);  
  54. }  
  55. }     
  56. }  
  57.  
  58. }  

C#共享内存操作类的基本内容就向你介绍到这里,希望对你了解和学习C#共享内存操作类有所帮助。

【编辑推荐】

  1. C#操作文本文件应用实例简析
  2. C#操作文本文件演练实例浅析
  3. C#操作内存之指针浅析
  4. C#操作内存读写方法浅析
  5. C#操作内存实例详解
责任编辑:仲衡 来源: CSDN博客
相关推荐

2009-08-18 13:49:21

C# 操作Excel

2009-08-19 11:34:06

C#操作Word

2009-08-19 11:13:49

C#操作Word

2009-08-31 18:38:59

C#写文件

2009-08-18 16:04:12

C# 操作Excel

2009-08-19 09:42:52

C#操作Word书签

2009-08-20 10:25:37

C#操作内存

2009-08-20 10:53:23

C#操作内存

2009-08-20 11:01:51

C#操作内存

2009-08-19 10:25:14

C#操作Word

2009-08-19 11:28:41

C#操作Word

2009-08-26 13:48:31

C#打印条码

2009-08-27 13:30:11

C# interfac

2009-08-18 17:42:12

C#操作符重载

2009-08-19 16:30:55

C#操作Access数

2009-08-19 14:12:23

C#操作注册表

2009-08-21 17:24:06

C# SingleIn

2009-08-21 17:24:06

C# SingleIn

2009-08-06 14:43:10

C# Calculat

2009-08-19 17:44:15

C#操作文本文件
点赞
收藏

51CTO技术栈公众号