当前位置:首页 > C# > 正文

C#进程间通信之共享内存(小白也能学会的Windows IPC技术详解)

在开发多进程应用程序时,C#进程间通信(IPC)是一个常见且关键的需求。其中,共享内存是一种高效、快速的通信方式,特别适用于需要频繁交换大量数据的场景。本文将带你从零开始,深入浅出地掌握C#共享内存示例的实现方法,即使你是编程新手,也能轻松上手!

C#进程间通信之共享内存(小白也能学会的Windows IPC技术详解) C#进程间通信 共享内存 C#共享内存示例 Windows IPC C# 第1张

什么是共享内存?

共享内存是一种Windows IPC C#支持的机制,允许多个进程访问同一块物理内存区域。由于数据无需复制,通信速度极快,是高性能应用的理想选择。

在 .NET 中,我们通常使用 MemoryMappedFile 类来创建和管理共享内存。它封装了底层 Windows API,使开发者能以更安全、简洁的方式操作共享内存。

实战:C# 共享内存写入端

首先,我们创建一个“写入端”程序,负责向共享内存写入数据。

using System;using System.IO.MemoryMappedFiles;using System.Text;class Writer{    static void Main()    {        // 创建一个名为 "MySharedMemory" 的共享内存区域,大小为 1024 字节        using (var mmf = MemoryMappedFile.CreateOrOpen("MySharedMemory", 1024))        {            // 创建一个可写入的视图流            using (var accessor = mmf.CreateViewAccessor())            {                string message = "Hello from Writer Process!";                byte[] buffer = Encoding.UTF8.GetBytes(message);                // 将消息长度写入前4字节(int占4字节)                accessor.Write(0, buffer.Length);                // 从第4字节开始写入实际消息                for (int i = 0; i < buffer.Length; i++)                {                    accessor.Write(i + 4, buffer[i]);                }                Console.WriteLine($"已写入消息: {message}");                Console.WriteLine("按任意键退出...");                Console.ReadKey();            }        }    }}

实战:C# 共享内存读取端

接下来,我们编写“读取端”程序,从同一个共享内存区域读取数据。

using System;using System.IO.MemoryMappedFiles;using System.Text;class Reader{    static void Main()    {        try        {            // 打开已存在的共享内存 "MySharedMemory"            using (var mmf = MemoryMappedFile.OpenExisting("MySharedMemory"))            {                using (var accessor = mmf.CreateViewAccessor())                {                    // 读取前4字节获取消息长度                    int length = accessor.ReadInt32(0);                    byte[] buffer = new byte[length];                    // 读取消息内容                    for (int i = 0; i < length; i++)                    {                        buffer[i] = accessor.ReadByte(i + 4);                    }                    string message = Encoding.UTF8.GetString(buffer);                    Console.WriteLine($"读取到的消息: {message}");                }            }        }        catch (FileNotFoundException)        {            Console.WriteLine("共享内存不存在,请先运行写入端程序。");        }        Console.WriteLine("按任意键退出...");        Console.ReadKey();    }}

运行与测试

  1. 先运行 Writer.exe,它会创建共享内存并写入消息;
  2. 再运行 Reader.exe,它会读取并显示消息;
  3. 两个程序可以独立编译和运行,只要共享内存名称一致即可通信。

注意事项

  • 同步问题:多个进程同时读写可能导致数据不一致,建议配合使用互斥体(Mutex)或信号量(Semaphore)进行同步;
  • 生命周期管理:最后一个使用共享内存的进程关闭后,系统会自动释放资源;
  • 安全性:在生产环境中,应考虑设置适当的访问权限,防止未授权访问。

总结

通过本文,你已经掌握了使用 C# 实现进程间通信之共享内存的核心方法。无论是开发高性能服务、游戏外挂检测,还是跨进程数据同步,这项技术都能大显身手。记住我们的四个关键词:C#进程间通信共享内存C#共享内存示例Windows IPC C#,它们是你深入学习 IPC 技术的基石。

动手试试吧!修改示例代码,加入同步机制,打造属于你自己的高效 IPC 系统!