题
我以前从未在 Windows 上做过 IPC。目前我正在开发两个程序,一个标准 GUI/CLI 应用程序和一个 Windows 服务。应用程序必须告诉服务要做什么。那么,假设通信仅是本地的,那么这两个进程的最佳通信方法是什么?
最佳被定义为更健壮且不易出错,而不是性能最高或最容易编码。
代码示例将非常受欢迎,但不是必需的:-)
注意我问的是使用什么,标准 TCP 套接字、命名管道或其他一些通信方式。
谢谢!
解决方案
.Net 中的 IPC 可以通过以下方式实现:
世界碳纤维
使用命名管道 需要.Net 3.0 以上。
代码示例
- WCF 类 网络命名管道绑定 可用于同一台机器上的进程间通信。此类的 MSDN 文档包含涵盖此场景的代码示例 http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx
远程处理
最初的IPC框架随.Net 1.0一起发布。我相信远程处理不再被积极开发,鼓励您改用 WCF
代码示例
通过远程处理进行进程间通信 - 使用 TCP 通道
资源
- GenuineChannels,销售包含共享内存通道的远程处理工具包。 http://www.genuinechannels.com/Index.aspx
- 英戈·拉姆尔, ,撰写了权威的 .Net 远程处理书籍, 高级 .NET 远程处理,第二版
使用 csharptest-net RpcLibrary 的 Win32 RPC
我最近遇到一个项目,它包装了Win32 RPC库并创建了一个可用于本地和远程RPC的.net类库
项目主页: http://csharptest.net/projects/rpclibrary/
MSDN参考资料:
- rpc 的工作原理: http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx
- RPC功能: http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx
还有一个在库之上运行的 google protocol buffers rpc 客户端: https://code.google.com/p/protobuf-csharp-rpc/
WM_复制数据
为了完整起见,也可以将 WIN32 方法与 WM_复制数据 信息。我之前在 .Net 1.1 中使用过此方法来创建从 Windows 资源管理器打开多个文件的单实例应用程序。
资源
插座
使用自定义协议(较难)
其他提示
仅对于本地,我们使用命名管道取得了成功。避免了 TCP 的开销,并且几乎(至少对于 .NET)尽可能高效,同时还拥有一个不错的 API 可供使用。
由于您仅限于 .Net 2.0,WCF 可能不是一个选择。您可以使用具有共享内存的 .Net 远程处理作为同一计算机上的应用程序域之间的底层通信机制。使用这种方法,您可以轻松地将进程放在不同的计算机上,并用网络协议替换共享内存协议。
与 Windows 服务通信的标准方法是使用服务控制代码。Windows 服务可以接收 0 到 255 之间的代码。0-127 为系统保留。128 到 255 可用于自定义命令。
如果您需要将复杂对象发送到服务,请使用数据库、xml、文件、tcp、http 等。除了发送控制命令(如重新加载配置、处理项目等)之外,还应使用此控制代码。
还有其他可用功能,例如查询服务。请参阅 Windows 服务文档和 api。
最好的选择是使用 WCF。您将能够在 Windows 服务中创建服务主机并公开 GUI 应用程序可以使用的定义良好的接口。如果您选择,WCF 将允许您通过命名管道进行通信,或者您也可以选择任何其他通信协议,如 TCP、HTTP 等。使用 WCF,您可以获得强大的工具支持和大量可用信息。
我想补充一下这个讨论。如果这是可行的,请斥责我 - 但信号量(或多个信号量)不能用于基本通信吗?