【问题标题】:IPC between a C# application and other applications in C++ and VB.NetC# 应用程序与 C++ 和 VB.Net 中的其他应用程序之间的 IPC
【发布时间】:2026-01-10 17:10:01
【问题描述】:

我有一个 C# 服务器应用程序,它需要与另外 3 个客户端应用程序通信和控制:一个在 C# 中,一个在 C++ 中,一个在 VB.Net 中。它们都是 Windows 窗体应用程序。他们基本上需要交换一些字符串和数字,而不是重载。在 C# 和那些不同的语言之间进行 IPC 的最佳方法是什么?请注意,客户端不相互通信,它们只与服务器通信。

C# 需要与 C++ 对话,所以我猜 WCF 不好,因为 WCF 只能在两个 .Net 应用程序之间工作?

我能否在所有这些语言中方便地使用命名管道:C#、C++ 和 VB.Net?

我还想知道将来是否必须添加 VB6、VBScript 和 PowerShell 脚本作为客户端,适用于所有这 6 种语言的最佳 IPC 选项是什么?我还能使用命名管道吗?

【问题讨论】:

标签: c# c++ ipc named-pipes


【解决方案1】:

实际上,配置为通过 HTTP 公开服务的 WCF 可能是您想要支持的语言列表的最佳选择。

如果您不喜欢 WCF,请考虑公开 HTTP REST 接口,即通过在 ASP.Net MVC 中编写服务器。

命名管道支持 - C#/VB.Net,C++ - 很好,VB6 - 我不知道,VBScript - 绝对不是开箱即用的,PowerShell - 是的,因为它可以使用 .Net 库。

【讨论】:

    【解决方案2】:

    对于您列出的语言,最快的解决方案是命名管道,更好的是内存映射文件。两者都在 .NET 4.0 和非托管 C++ 中实现。

    我建议查看内存映射文件。创建一个文件和一个关联的视图作为单生产者、多消费者、单向通道是相对简单的。例如,您可以使用该区域的前 4 个字节来存储写入的最后一个字节的更新值(以视图大小为模 - 4 个字节),并使用 EventWaitHandle 来同步生产者/消费者访问。访问单独内存映射文件的两个通道将为您提供一个双工通道。

    .NET (C# and VB.NET) 的链接和 unmanaged C++.

    然后您可能希望将 Protocol Buffers 视为序列化二进制数据的一种非常有效的方法。

    0MQ 是 Linux 领域的优秀产品,但 Windows 版本有些精简,而且不支持 IPC。

    【讨论】:

      【解决方案3】:

      您可以尝试不同的库,例如 OpenDDS、ZeroMQ 等。虽然 Windows 上的 ZeroMQ 还不支持 IPC(但支持 TCP)。

      【讨论】: