日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#操作內(nèi)存實例詳解

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

創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式全網(wǎng)營銷推廣需求,讓再小的品牌網(wǎng)站建設(shè)也能產(chǎ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. internal sealed class RCEvent { 
  13. public int Event; 
  14. public int Flag; 
  15. public string User; 
  16. }; 
  17.  //C#操作內(nèi)存
  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#操作內(nèi)存
  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#操作內(nèi)存
  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#操作內(nèi)存
  60. }

這樣我們就可以通過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. // RCEventAgent.WriteFlag( ptr, RCEventAgent.ReadFlag(ptr) + 1 ); 
  7. }

C++中則可以直接將結(jié)構(gòu)體地址傳給C#:

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

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


分享標題:C#操作內(nèi)存實例詳解
文章位置:http://www.dlmjj.cn/article/djescoo.html