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.  
  13. internal sealed class RCEvent {   
  14. public int Event;   
  15. public int Flag;   
  16. public string User;   
  17. };   
  18.  //C#操作内存
  19. internal sealed class RCEventAgent {   
  20. internal static RCEvent Read(IntPtr ptr){   
  21. RCEvent Event = new RCEvent();   
  22.    
  23. Event.Event = ReadEvent(ptr);   
  24. Event.Flag = ReadFlag(ptr);   
  25. Event.User = ReadUser(ptr);   
  26.  
  27. return Event;   
  28. }   
  29.  //C#操作内存
  30. internal static int ReadEvent(IntPtr basePtr) {   
  31. return Marshal.ReadInt32(basePtr);   
  32. }   
  33. internal static int ReadFlag(IntPtr basePtr) {   
  34. return Marshal.ReadInt32(basePtr,4);   
  35. }   
  36. internal static string ReadUser(IntPtr basePtr) {   
  37. return Marshal.PtrToStringAnsi(  
  38. new IntPtr(basePtr.ToInt32() + 8));   
  39. }   
  40.  
  41. internal static void Write(ClientEvent Event,IntPtr ptr) {   
  42. WriteEvent(ptr,Event.Event);   
  43. WriteFlag(ptr,Event.Flag);   
  44. WriteUser(ptr,Event.User);   
  45. }   
  46.  //C#操作内存
  47. internal static void WriteEvent(  
  48. IntPtr basePtr,int value) {   
  49. Marshal.WriteInt32(basePtr,value);   
  50. }   
  51. internal static void WriteFlag(  
  52. IntPtr basePtr,int flag) {   
  53. Marshal.WriteInt32(basePtr,4,flag);   
  54. }   
  55. internal static void WriteUser(  
  56. IntPtr basePtr,string user) {   
  57. WriteString(basePtr,user,8,40);   
  58. }   
  59. private static void WriteString(  
  60. IntPtr basePtr,string value,int offset,int length) {   
  61. int pos = 0;   
  62. byte[] bytes = Encoding.Default.GetBytes(value);   
  63. while(pos ﹤ length) {   
  64. if (pos ﹤ bytes.Length)   
  65. Marshal.WriteByte(basePtr,offset,bytes[pos]);   
  66. else   
  67. Marshal.WriteByte(basePtr,offset,0);   
  68.  
  69. pos ++;   
  70. offset ++;   
  71. }   
  72. }   //C#操作内存

这样我们就可以通过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. // 或者以下代码   
  7. // RCEventAgent.WriteFlag( ptr, RCEventAgent.ReadFlag(ptr) + 1 );   

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

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

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

【编辑推荐】

  1. C#操作文本文件之添加文本操作浅析
  2. C#操作文本文件应用实例简析
  3. C#操作文本文件演练实例浅析
  4. C#操作内存之指针浅析
  5. C#操作内存读写方法浅析
THE END