C#进程通信和数据共享

共享内存

在C#中可以使用MemoryMappedFile类创建共享内存区域。需要引用System.IO.MemoryMappedFiles命名空间。创建内存映射文件后,多个进程可以通过名称访问同一块内存区域。

// 写入进程
using (var mmf = MemoryMappedFile.CreateOrOpen("SharedMemory", 1024))
{
    using (var accessor = mmf.CreateViewAccessor())
    {
        accessor.Write(0, 123); // 写入数据
    }
}

// 读取进程
using (var mmf = MemoryMappedFile.OpenExisting("SharedMemory"))
{
    using (var accessor = mmf.CreateViewAccessor())
    {
        int value = accessor.ReadInt32(0); // 读取数据
    }
}

命名管道

NamedPipeServerStreamNamedPipeClientStream类实现进程间通信。服务器端创建管道,客户端连接后即可双向传输数据。

// 服务器端
using (var pipeServer = new NamedPipeServerStream("testpipe"))
{
    pipeServer.WaitForConnection();
    using (StreamWriter sw = new StreamWriter(pipeServer))
    {
        sw.WriteLine("Hello from server");
    }
}

// 客户端
using (var pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.In))
{
    pipeClient.Connect();
    using (StreamReader sr = new StreamReader(pipeClient))
    {
        string message = sr.ReadLine();
    }
}

TCP/IP套接字

通过TcpListenerTcpClient类实现网络通信。适用于不同机器间的进程通信,也可用于本地回环地址127.0.0.1。

// 服务器端
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8080);
server.Start();
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
byte[] data = Encoding.ASCII.GetBytes("Hello");
stream.Write(data, 0, data.Length);

// 客户端
TcpClient client = new TcpClient("127.0.0.1", 8080);
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);

文件映射

使用普通文件作为共享媒介,通过文件锁机制协调访问。适合需要持久化存储的共享数据。

// 写入进程
File.WriteAllText("shared.txt", "data");
// 读取进程
string data = File.ReadAllText("shared.txt");

Windows消息

通过SendMessagePostMessageAPI发送Windows消息。需要导入user32.dll并获取窗口句柄。

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

// 发送消息
SendMessage(targetHwnd, WM_COPYDATA, IntPtr.Zero, ref copyData);

注册表

将数据存储在Windows注册表中,适用于配置信息等小型数据的共享。

// 写入
RegistryKey key = Registry.CurrentUser.CreateSubKey("Software\\MyApp");
key.SetValue("SharedValue", "data");
key.Close();

// 读取
RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\\MyApp");
string value = key.GetValue("SharedValue").ToString();
key.Close();

数据库

使用SQLite、SQL Server等数据库作为共享数据存储。适合需要复杂查询和事务支持的应用场景。

// 进程A写入
using (var connection = new SQLiteConnection("Data Source=shared.db"))
{
    connection.Open();
    var command = new SQLiteCommand("INSERT INTO Data VALUES ('value')", connection);
    command.ExecuteNonQuery();
}

// 进程B读取
using (var connection = new SQLiteConnection("Data Source=shared.db"))
{
    connection.Open();
    var command = new SQLiteCommand("SELECT * FROM Data", connection);
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            string value = reader.GetString(0);
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值