C#操作内存实例详解

开发 后端
C#操作内存实例向你介绍了C#操作内存的原理和实现的步骤,以及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#操作内存读写方法浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-18 17:05:08

C#操作xml文件

2009-08-20 11:07:07

C#共享内存

2009-09-02 17:12:06

C#关机代码

2009-08-18 10:14:19

C#插件构架

2009-09-11 12:31:52

C#实例详解TypeConvert

2009-08-19 16:09:15

C#操作Access

2009-08-18 13:49:21

C# 操作Excel

2009-08-28 12:47:30

C#静态方法应用

2009-09-02 19:12:37

C#递归

2009-08-28 13:12:56

C#反射实例C#反射

2009-09-04 18:09:12

C# Main函数

2009-08-21 10:13:02

C#异步初步

2009-08-26 11:07:36

C#打印窗体

2009-09-01 11:25:08

C#读取Word文件

2009-09-07 05:50:59

C# Timer用法

2009-08-26 11:32:37

C#打印文档

2009-08-26 09:22:44

C#实现打印功能

2009-08-18 16:04:12

C# 操作Excel

2009-08-19 09:42:52

C#操作Word书签

2009-08-19 11:13:49

C#操作Word
点赞
收藏

51CTO技术栈公众号