新建两个进程程序:
A:
cs
static void Main(string[] args)
{
// 此处的 MemoryMappedFile 实例不能使用 using 语法
// 因为它会自动释放我们的内存映射文件,会导致进程B找不到这个映射文件而抛出异常
MemoryMappedFile mmf = MemoryMappedFile.CreateNew("IPC_MAP", 10000);
// 创建互斥量以协调数据的读写
Mutex mutex = new Mutex(true, "IPC_MAP_MUTEX", out bool mutexCreated);
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
StreamWriter sw = new StreamWriter(stream);
// 向内存映射文件种写入数据
sw.WriteLine("This is IPC MAP TEXT");
// 这一句是必须的,在某些情况下,如果不调用Flush 方法会造成进程B读取不到数据
// 它的作用是立即写入数据
// 这样在此进程释放 Mutex 的时候,进程B就能正确读取数据了
sw.Flush();
}
mutex.ReleaseMutex();
Console.ReadLine();
mmf.Dispose();
}
B:
cs
static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("IPC_MAP"))
{
Mutex mutex = Mutex.OpenExisting("IPC_MAP_MUTEX");
// 等待写入完成
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
StreamReader sr = new StreamReader(stream);
// 读取进程 A 写入的内容
Console.WriteLine(sr.ReadLine());
}
mutex.ReleaseMutex();
}
Console.ReadLine();
}
依次启动A、B,在B的窗口中:

代码引用自:
那MemoryMappedFile.CreateNew是什么回事呢?
一直F12深入下去看看:

还是调用的win32的CreateFileMapping,但是多了很多封装,使用起来很方便。
关于CreateFileMapping,资源就很多了,这里不赘述。
另外,C#中很多对象是可以在进程间共享的,可以自行学习。