//持久内存映射文件:基于现有文件创建一个具有指定公用名的内存映射文件 using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\内存映射文件.data", FileMode.Open, "公用名")) { //通过指定的 偏移量和大小 创建内存映射文件视图服务器 using (var accessor = mmf.CreateViewAccessor(offset, length)) //偏移量,可以控制数据存储的内存位置;大小,用来控制存储所占用的空间 { //Marshal提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。 int size = Marshal.SizeOf(typeof(char)); //修改内存映射文件视图 for (long i = 0; i < length; i += size) { char c= accessor.ReadChar(i); accessor.Write(i, ref c); } } } //另一个进程或线程可以,在系统内存中打开一个具有指定名称的现有内存映射文件 using (var mmf = MemoryMappedFile.OpenExisting("公用名")) { using (var accessor = mmf.CreateViewAccessor(4000000, 2000000)) { int size = Marshal.SizeOf(typeof(char)); for (long i = 0; i < length; i += size) { char c = accessor.ReadChar(i); accessor.Write(i, ref c); } } } //非持久内存映射文件:未映射到磁盘上的现有文件的内存映射文件 using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000)) { bool mutexCreated; //进程间同步 Mutex mutex = newMutex(true, "testmapmutex", out mutexCreated); using (var stream = mmf.CreateViewStream()) //创建文件内存视图流 基于流的操作 { var writer = newBinaryWriter(stream); writer.Write(1); } mutex.ReleaseMutex(); Console.WriteLine("Start Process B and press ENTER to continue."); Console.ReadLine(); mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { var reader = newBinaryReader(stream); Console.WriteLine("Process A says: {0}", reader.ReadBoolean()); Console.WriteLine("Process B says: {0}", reader.ReadBoolean()); } mutex.ReleaseMutex(); } using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap")) { Mutex mutex = Mutex.OpenExisting("testmapmutex"); mutex.WaitOne(); using (var stream = mmf.CreateViewStream(1, 0))//注意这里的偏移量 { var writer = newBinaryWriter(stream); writer.Write(0); } mutex.ReleaseMutex(); }
IMServer_Message.exe 代码
using System; using System.IO; using System.IO.MemoryMappedFiles; using System.Runtime.InteropServices; using System.Threading; namespace IMServer_Message { /// <summary> /// 用于共享内存方式通信的 值类型 结构体 /// </summary> public struct ServiceMsg { public int Id; public long NowTime; } internal class Program { private static void Main(string[] args) { Console.Write("请输入共享内存公用名(默认:testmap):"); string shareName = Console.ReadLine(); if (string.IsNullOrEmpty(shareName)) shareName = "testmap"; using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(shareName, 1024000,MemoryMappedFileAccess.ReadWrite)) { bool mutexCreated; //进程间同步 var mutex = new Mutex(true, "testmapmutex", out mutexCreated); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) //创建文件内存视图流 { var writer = new BinaryWriter(stream); for (int i = 0; i < 5; i++) { writer.Write(i); Console.WriteLine("{0}位置写入流:{0}", i); } } mutex.ReleaseMutex(); Console.WriteLine("启动状态服务,按【回车】读取共享内存数据"); Console.ReadLine(); mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { var reader = new BinaryReader(stream); for (int i = 0; i < 10; i++) { Console.WriteLine("{1}位置:{0}", reader.ReadInt32(), i); } } using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor(1024, 10240)) { int colorSize = Marshal.SizeOf(typeof (ServiceMsg)); ServiceMsg color; for (int i = 0; i < 50; i += colorSize) { accessor.Read(i, out color); Console.WriteLine("{1}\tNowTime:{0}", new DateTime(color.NowTime), color.Id); } } mutex.ReleaseMutex(); } Console.WriteLine("测试: 我是 即时通讯 - 消息服务 我启动啦!!!"); Console.ReadKey(); } } }
IMServer_State.exe代码
using System; using System.IO; using System.IO.MemoryMappedFiles; using System.Runtime.InteropServices; using System.Threading; namespace IMServer_State { /// <summary> /// 用于共享内存方式通信的 值类型 结构体 /// </summary> public struct ServiceMsg { public int Id; public long NowTime; } internal class Program { private static void Main(string[] args) { Console.Write("请输入共享内存公用名(默认:testmap):"); string shareName = Console.ReadLine(); if (string.IsNullOrEmpty(shareName)) shareName = "testmap"; using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(shareName, 1024000,MemoryMappedFileAccess.ReadWrite)) { Mutex mutex = Mutex.OpenExisting("testmapmutex"); mutex.WaitOne(); using (MemoryMappedViewStream stream = mmf.CreateViewStream(20, 0)) //注意这里的偏移量 { var writer = new BinaryWriter(stream); for (int i = 5; i < 10; i++) { writer.Write(i); Console.WriteLine("{0}位置写入流:{0}", i); } } using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor(1024, 10240)) { int colorSize = Marshal.SizeOf(typeof (ServiceMsg)); var color = new ServiceMsg(); for (int i = 0; i < colorSize*5; i += colorSize) { color.Id = i; color.NowTime = DateTime.Now.Ticks; //accessor.Read(i, out color); accessor.Write(i, ref color); Console.WriteLine("{1}\tNowTime:{0}", new DateTime(color.NowTime), color.Id); Thread.Sleep(1000); } } Thread.Sleep(5000); mutex.ReleaseMutex(); } Console.WriteLine("测试: 我是 即时通讯 - 状态服务 我启动啦!!!"); Console.ReadKey(); } } }
源代码如下:
链接:https://pan.baidu.com/s/1x09IixcsRBSFKlEhCF1MNg
提取码:q2al
--来自百度网盘超级会员V4的分享
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


