【问题标题】:What is the easiest way to do inter process communication in C#? [closed]在 C# 中进行进程间通信的最简单方法是什么? [关闭]
【发布时间】:2010-12-20 14:57:10
【问题描述】:

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

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

【问题讨论】:

标签: c# ipc communication interprocess


【解决方案1】:

最简单和最可靠的方法几乎可以肯定是IpcChannel(又名进程间通信通道);这就是它的用途。只需几行代码和配置即可启动并运行它。

【讨论】:

  • 很简单;容易,等等......到目前为止,我所看到的最简单。
  • 仅适用于 .NET 框架应用,.NET Core 中不支持
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我创建了自己的开源库,用于在 Windows 服务、控制台应用程序和 Windows 表单之间工作的快速简便的 IPC。

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

    here

    【讨论】:

      【解决方案4】:

      另一种方法是模仿命名管道。在某处声明一个文件,然后对其进行读取/写入。

      或者,如果程序按顺序执行,您可以尝试使用剪贴板...但该解决方案非常丑陋且有问题(有时 .NET 无缘无故无法访问剪贴板)。

      【讨论】:

      • 我强烈反对剪贴板部分。当您可以简单地使用实际的命名管道时,我认为模仿命名管道没有任何意义?
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          唯一的问题是他们应该如何就端口号达成一致,以及他们如何知道他们正在相互交谈。他们可以通过您决定他们应该始终使用端口 12345(例如)就端口号达成一致,而第二部分的肮脏解决方案是相信与您交谈的任何人都是好人。

          【讨论】:

          • 其实,据我记得,你可以指定从哪些地址接受连接(或者至少检查它来自哪个地址,如果不是本地主机......好吧,永远不要说话对陌生人 ;) ).
          【解决方案8】:

          我不是专业人士,但使用 StreamInsight 观察观察者设计模式似乎是最理想的途径,但在多线程应用程序中存在繁重负载的限制(您将获得太多上下文切换)。

          作为一名业余程序员,我发现 XDMessaging 对我来说既简单又简单。它在 NuGet 中也很容易安装,网址是 XDMessaging

          【讨论】:

          • 请提供没有外部库的解决方案
          【解决方案9】:

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

          【讨论】:

            猜你喜欢
            • 2018-05-31
            • 2019-04-20
            • 2010-10-06
            • 2014-07-12
            • 2012-06-20
            • 2018-05-31
            • 1970-01-01
            • 2010-09-10
            相关资源
            最近更新 更多