在C#中进行进程间通信的最简单方法是什么?

时间:2009-11-26 09:10:14

标签: c# ipc communication interprocess

我有两个C#应用程序,我希望其中一个发送两个整数到另一个(这不一定很快,因为它每隔几秒只调用一次)。

最简单的方法是什么? (它不一定是最优雅的。)

9 个答案:

答案 0 :(得分:18)

最简单,最可靠的方式几乎可以肯定IpcChannel(a.k.a. Inter Process Communication Channel);这就是它的用途。您可以使用几行代码和配置来启动和运行。

答案 1 :(得分:5)

您可以尝试.NET Remoting。这是一个简单的例子:CodeProject .NET Remoting

如果您使用的是.NET 3.5,那么您应该选择WCF,因为Remoting正逐渐过时。同样,周围有很多examples for WCF

答案 2 :(得分:2)

我已经创建了自己的开源库,用于快速简便的IPC,可以在Windows服务,控制台应用程序和Windows窗体之间工作。

它比现有的IPC实现有一些优势,不需要任何配置。

请参阅here

答案 3 :(得分:0)

我会说让他们通过套接字说话。

在套接字上放置一个程序listen,并将另一个connect放在第一个上。将两个整数作为数字串发送到一行。

唯一的问题是他们应该如何就港口号码达成一致,以及他们如何知道他们正在互相交谈。他们可以通过判断他们应该总是使用端口12345(比如说)来同意端口号,而第二部分的脏兮兮的解决办法就是只相信你和谁说话是个好人。

答案 4 :(得分:0)

另一种方法是模仿命名管道。在某处声明一个文件,并从中读取/写入它。

或者,如果程序按顺序执行,你可以尝试剪贴板......但是这个解决方案很丑陋而且很麻烦(有时.NET无法无缘无故地访问剪贴板)。

答案 5 :(得分:0)

为了完整起见,您还可以使用net.pipeWCF

答案 6 :(得分:0)

我创建了一个简单的类,该类使用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。

答案 7 :(得分:0)

我不是专业人士,但是看到采用StreamInsight的观察器设计模式似乎是最理想的途径,但是在多线程应用程序中,由于负担很重,因此存在局限性(您会获得太多的上下文切换)。

作为一名业余程序员,我发现XDMessaging对我来说很容易。 NuGet也是如此易于安装,网站为XDMessaging

答案 8 :(得分:0)

如果您不希望一个程序从另一个程序获取那么多数据,您可以让一个程序在某处创建一个 .txt 文件,然后让另一个程序读取该文本文件。它也有局限性,比如它们不能同时读/写,这需要一些尝试/捕捉来修复。不是最专业的方式,但它完全有效。