c++ - .NET 和 native C++ 应用程序之间通信的最佳方式

标签 c++ .net windows winforms

如标题所述 - 目前我有两个应用程序。一种是 .NET、winforms,另一种是 native C++。两者一起工作并且必须通信(C++ 到 .NET 和 .NET 到 C++),.NET 应用程序是从 C++ 应用程序启动的。目前,通信是通过将数据写入文件并发送邮件通知 C++ 应用程序数据已写入来完成的。虽然它有效,但我认为这不是最好的方法。因此,我想问你,你会推荐什么作为最好的方法。我正在考虑围绕 .NET 编写一个 CLI 包装器以将其绑定(bind)到 C++ 中。与将数据写入文件相比,使用此类包装器有什么缺点吗?

--------更新--------

我忘了补充一点,这两个应用程序总是在同一台机器上运行。该解决方案应该适用于 Windows xp、win7、win8

--------结论------

非常感谢您的回答,所有这些都非常有帮助。 Furkan Omay - offically supported Inter-Process Communications methods on Microsoft Windows 的回答中提供了有关进程间通信技术之间差异的良好概述。 . 然而,像这个 web site 上的防病毒程序似乎存在问题来自迈克菲。在某些情况下,这可能是一个大问题。 根据使用 C++/Cli,我喜欢 Drax 的回答,谢谢。我也没有看到使用包装器的任何缺点。一个很好的教程是here .

最佳答案

有几种选择可以实现这一目标。

  1. 客户端/服务器连接

    您的应用程序需要监听 TCP(首选)或 UDP 端口,而其他应用程序则连接它。

    使您能够将您的应用程序分离到另一台计算机/网络接口(interface)。

    但是你在机器上预留了一个端口。您需要确保它不受互联网影响。一些内部防火墙可能会提示,即使在本地主机上也是如此。 (但他们不会阻止它。)

  2. 命名管道

    可以读写like a regular file . .NET 内置支持 System.IO.Pipes

    与基于纯文件的方法的主要区别是 the application can wait用于处理数据。这就像等待水从管道中流出。

    您需要处理管道的方向和安全性,然后妥善处理它们。

    Google Chrome使用此方法在不同的工作进程之间进行通信。

  3. Windows 消息调度

    如 i486 所述,您可以使用 RegisterWindowMessage 注册自定义消息并使用 SendMessage 或 PostMessage 发送它们。这是对 C++ 更友好的方法。

    写得不好的应用程序可能会导致 resource exhaustion但这不会轻易发生。

  4. 邮槽

    这是 Ian Goldby 建议的。 Mailslots 提供应用程序之间的单向消息发送 very simple Windows API Call .最适合发送很多小字符串。

  5. 消息队列

    您可以将您的应用程序连接到消息代理,如 RabbitMQ ,并使用发布-订阅模型来传递数据。这需要一个您不需要的服务器,但是:

    您可以使用 ZeroMQ可以无服务器工作。它速度极快,可以通过不同的技术进行通信。但是,与以前的方法相比,它需要阅读更多的文档才能实现所需的行为。

  6. 标准输入/输出

    您可以重定向您的 stdout,子进程可以通过 stdin 接收它。

根据您的要求,我个人会使用命名管道。他们留在计算机上,不需要对代码进行太多更改。之前我做了一个 C# 应用程序,它与一个用 C++ 编写的 OpenCV 应用程序进行通信,并且命名管道在这种情况下工作得很好。

您可以用两种语言创建两个简单的类以在它们之间传递数据。

但是,所有其他解决方案仍然有效。 TCP/IP 仍然可以在同一台机器上工作。消息、邮槽、套接字和管道是 offically supported Inter-Process Communications methods on Microsoft Windows 之一它们甚至可以在 Windows 2000 上运行。

关于c++ - .NET 和 native C++ 应用程序之间通信的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30910094/

相关文章:

c# - 将所有低位设置为 0,直到剩下两个 1(对于存储为字节数组的数字)

c# - 如何获得 "200 OK"的 HttpWebResponse?

windows - 请求中未包含有效的面包屑 - Windows 上的 Jenkins

c++ - 找不到导入的项目 "C:\Microsoft.Cpp.Redirect.14.props"

c++ - 为每个节点定义一个唯一的整数

ASP.NET WebAPI 将 urlencoded 正文中的空字符串作为 null 传递

c# - 如何获取 System.Diagnostics.Process 的输出?

c++ - 如何使用 Boost.Filesystem 更改当前路径

c++ - 使用消息队列在进程之间传递消息

windows - 没有图标的QMessageBox