C#操作内存实例详解

C# 操作内存是如何实现的呢?让我们开始讲解吧:

创新互联不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的成都网站建设、网站设计质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式全网营销推广需求,让再小的品牌网站建设也能产生价值!

我们先来看看C#中如何操作内存,也就是非托管的数据。这需要引用System.Runtime.InteropServices命名空间。该命名空间下的Marshal的一些静态方法提供了这样的功能:

 
 
 
  1. Marshal.ReadInt32()
  2. //从指定内存地址读取4位 C#操作内存
  3. Marshal.PtrToStringAnsi()
  4. //从指定内存地址读取字符串C#操作内存 
  5. Marshal.WriteInt32()
  6. //将整数写到指定内存地址 C#操作内存
  7. Marshal.WriteByte()
  8. //将字符串写到指定内存地址我们来看看具体的代码: 
  9. using System; 
  10. using System.Text; 
  11. using System.Runtime.InteropServices; 
  12. internal sealed class RCEvent { 
  13. public int Event; 
  14. public int Flag; 
  15. public string User; 
  16. }; 
  17.  //C#操作内存
  18. internal sealed class RCEventAgent { 
  19. internal static RCEvent Read(IntPtr ptr){ 
  20. RCEvent Event = new RCEvent(); 
  21.  
  22. Event.Event = ReadEvent(ptr); 
  23. Event.Flag = ReadFlag(ptr); 
  24. Event.User = ReadUser(ptr); 
  25. return Event; 
  26.  //C#操作内存
  27. internal static int ReadEvent(IntPtr basePtr) { 
  28. return Marshal.ReadInt32(basePtr); 
  29. internal static int ReadFlag(IntPtr basePtr) { 
  30. return Marshal.ReadInt32(basePtr,4); 
  31. internal static string ReadUser(IntPtr basePtr) { 
  32. return Marshal.PtrToStringAnsi(
  33. new IntPtr(basePtr.ToInt32() + 8)); 
  34. internal static void Write(ClientEvent Event,IntPtr ptr) { 
  35. WriteEvent(ptr,Event.Event); 
  36. WriteFlag(ptr,Event.Flag); 
  37. WriteUser(ptr,Event.User); 
  38.  //C#操作内存
  39. internal static void WriteEvent(
  40. IntPtr basePtr,int value) { 
  41. Marshal.WriteInt32(basePtr,value); 
  42. internal static void WriteFlag(
  43. IntPtr basePtr,int flag) { 
  44. Marshal.WriteInt32(basePtr,4,flag); 
  45. internal static void WriteUser(
  46. IntPtr basePtr,string user) { 
  47. WriteString(basePtr,user,8,40); 
  48. private static void WriteString(
  49. IntPtr basePtr,string value,int offset,int length) { 
  50. int pos = 0; 
  51. byte[] bytes = Encoding.Default.GetBytes(value); 
  52. while(pos ﹤ length) { 
  53. if (pos ﹤ bytes.Length) 
  54. Marshal.WriteByte(basePtr,offset,bytes[pos]); 
  55. else 
  56. Marshal.WriteByte(basePtr,offset,0); 
  57. pos ++; 
  58. offset ++; 
  59. }   //C#操作内存
  60. }

这样我们就可以通过ReadEvent和WriteEvent直接在c#中处理该结构体。或者通过 ReadXXX() 和 WriteXXX() 直接修改其字段。

 
 
 
  1. public void DoSomething(IntPtr ptr){ 
  2. RCEvent Event = RCEventAgent.Read(ptr); 
  3. Event.Flag ++; 
  4. RCEventAgent.Write(ptr, Event); 
  5. // 或者以下代码 
  6. // RCEventAgent.WriteFlag( ptr, RCEventAgent.ReadFlag(ptr) + 1 ); 
  7. }

C++中则可以直接将结构体地址传给C#:

 
 
 
  1. #using   ﹤mscorlib.dll﹥ 
  2. #using   ﹤CuteSuProc.dll﹥ 
  3. void SomeMethod(RCEStruct* pEventStruc){ 
  4. MyCSharpDll::DoSomething(pEventStruc); 
  5. }

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

网页标题:C#操作内存实例详解
URL标题:http://www.hantingmc.com/qtweb/news40/279640.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联