我有两个 Windows 服务,第一个用 C# 编写,第二个用非托管 C++ 编写,我想知道如何进行双向进程间通信。
8 回答
如果进程间通信总是要在同一台机器上完成,那么命名管道是可行的方法,因为它们比其他选项更快。
但是,如果这种通信有可能在某个时刻跨越机器边界发生,那么请使用套接字方法。对于 C++,您需要 winsock2.h 头文件。在 C# 中,使用System.Net.Sockets
命名空间。
自从我完成非托管 C++ 以来已经有一段时间了,但我记得如果你在 C++ 端创建服务器然后TcpClient
在 C# 端使用类,你将不得不编写更少的 C++ 代码。
套接字可能是你最好的选择。
使用套接字,您不必绑定到同一台机器上的两个程序。
此外,它可能是最便携的选项(见鬼,Windows 甚至有 select() 用于套接字)。
套接字和命名管道是托管和非托管环境中很好支持的两个选项。
有很多方法可以做到这一点,但我认为最好的方法是使用 WCF 和 COM+。如果在 COM+ 中托管服务,则可以通过 .NET 服务中的 WCF 以及非托管代码中的 COM 接口访问它。
您可能需要查看 MSDN 文档的以下部分以开始使用:
将 WCF 服务与 COM+ 集成:http: //msdn.microsoft.com/en-us/library/bb735856.aspx
与 COM+ 应用程序集成概述:http: //msdn.microsoft.com/en-us/library/ms734723.aspx
我会说套接字和消息传递系统。检查我们的Google Protocol Buffers。
使用 DCOM/RPC 或命名管道 - 其他任何东西要么不安全,要么不安全,要么两者兼而有之。
创建一个单例 COM 对象。维护此 COM 对象中的数据,C++ 和 C# 应用程序都可以读取这些数据。
我会说 redis 将是任何类型的进程间通信的最佳解决方案