我有两个C#应用程序,我希望其中一个发送两个整数到另一个(这不一定很快,因为它每隔几秒只调用一次)。
最简单的方法是什么? (它不一定是最优雅的。)
最简单和最可靠的方式几乎肯定是IpcChannel(a.k.a. Inter Process Communication Channel);这就是它的用途。您可以使用几行代码和配置来启动和运行它。
您可以尝试.NET Remoting。这是一个简单的例子:CodeProject .NET Remoting。
如果您使用的是.NET 3.5,那么您应该选择WCF,因为Remoting正在逐渐过时。再次,周围有许多examples for WCF。
我会说让他们通过套接字说话。
在套接字上有一个程序listen
,并且第一个有另一个connect
。将两个整数发送到一行,作为数字串。
唯一的问题是他们应该如何就港口号码达成一致,以及他们如何知道他们正在互相交谈。他们可以通过你决定他们应该总是使用端口12345(比如说)来同意端口号码,而第二部分的脏兮兮的解决办法就是只相信你和谁说话是个好人。
另一种方法是模仿命名管道。在某处声明一个文件,并从中读取/写入它。
或者,如果程序按顺序执行,你可以尝试剪贴板......但是这个解决方案很丑陋而且有问题(有时.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
。
我不是专业人士,但看到使用StreamInsight的观察者设计模式似乎是最理想的途径,但是在多线程应用程序中有很多负载(你会得到太多的上下文切换)。
作为业余程序员,我发现XDMessaging对我来说简单易行。它在NuGet中也很容易安装,网站是XDMessaging