C#中怎么对内存进行操作,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
引用System.Runtime.InteropServices命名空间。该命名空间下的Marshal的一些静态方法提供了这样的功能:
Marshal.ReadInt32() //从指定内存地址读取4位 C#操作内存 Marshal.PtrToStringAnsi() //从指定内存地址读取字符串C#操作内存 Marshal.WriteInt32() //将整数写到指定内存地址 C#操作内存 Marshal.WriteByte() //将字符串写到指定内存地址我们来看看具体的代码: using System; using System.Text; using System.Runtime.InteropServices; internal sealed class RCEvent { public int Event; public int Flag; public string User; }; //C#操作内存internal sealed class RCEventAgent { internal static RCEvent Read(IntPtr ptr){ RCEvent Event = new RCEvent(); Event.Event = ReadEvent(ptr); Event.Flag = ReadFlag(ptr); Event.User = ReadUser(ptr); return Event; } //C#操作内存internal static int ReadEvent(IntPtr basePtr) { return Marshal.ReadInt32(basePtr); } internal static int ReadFlag(IntPtr basePtr) { return Marshal.ReadInt32(basePtr,4); } internal static string ReadUser(IntPtr basePtr) { return Marshal.PtrToStringAnsi( new IntPtr(basePtr.ToInt32() + 8)); } internal static void Write(ClientEvent Event,IntPtr ptr) { WriteEvent(ptr,Event.Event); WriteFlag(ptr,Event.Flag); WriteUser(ptr,Event.User); } //C#操作内存internal static void WriteEvent( IntPtr basePtr,int value) { Marshal.WriteInt32(basePtr,value); } internal static void WriteFlag( IntPtr basePtr,int flag) { Marshal.WriteInt32(basePtr,4,flag); } internal static void WriteUser( IntPtr basePtr,string user) { WriteString(basePtr,user,8,40); } private static void WriteString( IntPtr basePtr,string value,int offset,int length) { int pos = 0; byte[] bytes = Encoding.Default.GetBytes(value); while(pos ﹤ length) { if (pos ﹤ bytes.Length) Marshal.WriteByte(basePtr,offset,bytes[pos]); else Marshal.WriteByte(basePtr,offset,0); pos ++; offset ++; } } //C#操作内存}
这样我们就可以通过ReadEvent和WriteEvent直接在c#中处理该结构体。或者通过 ReadXXX() 和 WriteXXX() 直接修改其字段。
public void DoSomething(IntPtr ptr){ RCEvent Event = RCEventAgent.Read(ptr); Event.Flag ++; RCEventAgent.Write(ptr, Event); // 或者以下代码 // RCEventAgent.WriteFlag( ptr, RCEventAgent.ReadFlag(ptr) + 1 ); }
C++中则可以直接将结构体地址传给C#:
#using ﹤mscorlib.dll﹥ #using ﹤CuteSuProc.dll﹥ void SomeMethod(RCEStruct* pEventStruc){ MyCSharpDll::DoSomething(pEventStruc); }
关于C#中怎么对内存进行操作问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。