共享内存
在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); // 读取数据
}
}
命名管道
NamedPipeServerStream和NamedPipeClientStream类实现进程间通信。服务器端创建管道,客户端连接后即可双向传输数据。
// 服务器端
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套接字
通过TcpListener和TcpClient类实现网络通信。适用于不同机器间的进程通信,也可用于本地回环地址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消息
通过SendMessage和PostMessageAPI发送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);
}
}
}
1348

被折叠的 条评论
为什么被折叠?



