自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#操作內(nèi)存實例詳解

開發(fā) 后端
C#操作內(nèi)存實例向你介紹了C#操作內(nèi)存的原理和實現(xiàn)的步驟,以及C#操作內(nèi)存時需要注意的事項,希望對你的學(xué)習(xí)有所幫助。

C# 操作內(nèi)存是如何實現(xiàn)的呢?讓我們開始講解吧:

我們先來看看C#中如何操作內(nèi)存,也就是非托管的數(shù)據(jù)。這需要引用System.Runtime.InteropServices命名空間。該命名空間下的Marshal的一些靜態(tài)方法提供了這樣的功能:

  1. Marshal.ReadInt32()  
  2. //從指定內(nèi)存地址讀取4位 C#操作內(nèi)存  
  3. Marshal.PtrToStringAnsi()  
  4. //從指定內(nèi)存地址讀取字符串C#操作內(nèi)存   
  5. Marshal.WriteInt32()  
  6. //將整數(shù)寫到指定內(nèi)存地址 C#操作內(nèi)存  
  7. Marshal.WriteByte()  
  8. //將字符串寫到指定內(nèi)存地址我們來看看具體的代碼:   
  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#操作內(nèi)存
  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#操作內(nèi)存
  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#操作內(nèi)存
  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#操作內(nèi)存

這樣我們就可以通過ReadEvent和WriteEvent直接在c#中處理該結(jié)構(gòu)體?;蛘咄ㄟ^ 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++中則可以直接將結(jié)構(gòu)體地址傳給C#:

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

C#操作內(nèi)存的具體內(nèi)容就向你介紹到這里,希望對你了解和學(xué)習(xí)C#操作內(nèi)存有所幫助。

【編輯推薦】

  1. C#操作文本文件之添加文本操作淺析
  2. C#操作文本文件應(yīng)用實例簡析
  3. C#操作文本文件演練實例淺析
  4. C#操作內(nèi)存之指針淺析
  5. C#操作內(nèi)存讀寫方法淺析
責(zé)任編輯:仲衡 來源: 博客園
相關(guān)推薦

2009-08-18 17:05:08

C#操作xml文件

2009-08-20 11:07:07

C#共享內(nèi)存

2009-09-11 12:31:52

C#實例詳解TypeConvert

2009-08-18 10:14:19

C#插件構(gòu)架

2009-09-02 17:12:06

C#關(guān)機代碼

2009-08-18 13:49:21

C# 操作Excel

2009-08-19 16:09:15

C#操作Access

2009-09-04 18:09:12

C# Main函數(shù)

2009-08-28 13:12:56

C#反射實例C#反射

2009-08-21 10:13:02

C#異步初步

2009-08-26 09:22:44

C#實現(xiàn)打印功能

2009-08-26 11:07:36

C#打印窗體

2009-09-02 19:12:37

C#遞歸

2009-09-07 05:50:59

C# Timer用法

2009-08-26 11:32:37

C#打印文檔

2009-09-01 11:25:08

C#讀取Word文件

2009-08-28 12:47:30

C#靜態(tài)方法應(yīng)用

2009-08-31 18:38:59

C#寫文件

2009-08-19 11:34:06

C#操作Word

2009-08-19 11:13:49

C#操作Word
點贊
收藏

51CTO技術(shù)棧公眾號