在.NET和本机C ++应用程序之间进行通信的最佳方式

时间:2015-06-18 08:22:56

标签: c++ .net windows winforms

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

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

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

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

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

4 个答案:

答案 0 :(得分:5)

有几种方法可以实现这一目标。

  1. 客户端/服务器连接

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

    使您能够将应用程序与另一台计算机/网络接口分开。

    但是你在机器上预留了一个端口。您需要确保它免受互联网的侵害。即使在localhost上,一些内部防火墙也可能会抱怨。 (但他们不会阻止它。)

  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接收它。

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

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

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

答案 1 :(得分:1)

通常我会为两个应用注册initialize: function(options){ console.log('Category Layout: initialized'); console.log(options.model); }, API的自定义消息。

答案 2 :(得分:1)

cli包装器的主要(唯一?)缺点是它需要更多的开发时间,因为它需要更多的项目来编写/调试/维护。但如果您的应用程序不是小型应用程序,它可能是最合理的解决方案。

否则,您可以选择其他通信层,如NamedPipes或Sockets,它们非常通用,但添加了一个不必要的协议层,如果您将本机代码包装在C ++ / Cli中,则该层不存在。这个语言是为这个用例发明的。

答案 3 :(得分:0)

我们有同样的问题。从.net到c ++,我们称为dll,从c ++到.net,我们构建了一个本地Web服务,向c ++提供了可靠的api

相关问题