【发布时间】:2010-12-20 14:57:10
【问题描述】:
我有两个 C# 应用程序,我希望其中一个向另一个发送两个整数(这不必很快,因为它每隔几秒才调用一次)。
最简单的方法是什么? (它不一定是最优雅的。)
【问题讨论】:
标签: c# ipc communication interprocess
我有两个 C# 应用程序,我希望其中一个向另一个发送两个整数(这不必很快,因为它每隔几秒才调用一次)。
最简单的方法是什么? (它不一定是最优雅的。)
【问题讨论】:
标签: c# ipc communication interprocess
最简单和最可靠的方法几乎可以肯定是IpcChannel(又名进程间通信通道);这就是它的用途。只需几行代码和配置即可启动并运行它。
【讨论】:
您可以尝试 .NET Remoting。这是一个简单的例子:CodeProject .NET Remoting。
如果您使用的是 .NET 3.5,则应该选择 WCF,因为 Remoting 正在慢慢过时。同样,周围有很多examples for WCF。
【讨论】:
我创建了自己的开源库,用于在 Windows 服务、控制台应用程序和 Windows 表单之间工作的快速简便的 IPC。
与现有的 IPC 实现相比,它具有一些优势,并且不需要任何配置。
见here。
【讨论】:
另一种方法是模仿命名管道。在某处声明一个文件,然后对其进行读取/写入。
或者,如果程序按顺序执行,您可以尝试使用剪贴板...但该解决方案非常丑陋且有问题(有时 .NET 无缘无故无法访问剪贴板)。
【讨论】:
我创建了一个简单的类,它使用 IpcChannel 类进行进程间通信。 这是Gist at GitHub的链接。
服务器端代码:
IpcClientServer ipcClientServer = new IpcClientServer();
ipcClientServer.CreateServer("localhost", 9090);
IpcClientServer.RemoteMessage.MessageReceived += IpcClientServer_MessageReceived;
事件监听器:
private void IpcClientServer_MessageReceived(object sender, MessageReceivedEventArgs e)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(delegate { textBox2.Text += e.Message +
Environment.NewLine; }));
}
else
{
textBox2.Text += e.Message + Environment.NewLine;
}
}
客户:
if (ipcClientServer == null)
{
ipcClientServer = new IpcClientServer();
ipcClientServer.CreateClient("localhost", 9090);
}
ipcClientServer.SendMessage(textBox1.Text);
注意:需要引用 System.Runtime.Remoting。
【讨论】:
为了完整起见,您还可以使用net.pipe 和WCF。
【讨论】:
我会说让他们通过套接字交谈。
将一个程序 listen 放在一个套接字上,将另一个 connect 放在第一个程序上。在一行中发送两个整数,作为数字字符串。
唯一的问题是他们应该如何就端口号达成一致,以及他们如何知道他们正在相互交谈。他们可以通过您决定他们应该始终使用端口 12345(例如)就端口号达成一致,而第二部分的肮脏解决方案是相信与您交谈的任何人都是好人。
【讨论】:
我不是专业人士,但使用 StreamInsight 观察观察者设计模式似乎是最理想的途径,但在多线程应用程序中存在繁重负载的限制(您将获得太多上下文切换)。
作为一名业余程序员,我发现 XDMessaging 对我来说既简单又简单。它在 NuGet 中也很容易安装,网址是 XDMessaging
【讨论】:
如果您不希望一个程序从另一个程序获取那么多数据,您可以让一个程序在某处创建一个 .txt 文件,然后让另一个程序读取该文本文件。它也有局限性,就像它们不能同时读/写,这需要一些尝试/捕获来修复。不是最专业的方式,但它完全有效。
【讨论】: