我以前从未在 Windows 上进行过 IPC。我正在开发一对程序、一个标准的 GUI/CLI 应用程序和一个 Windows 服务。该应用程序必须告诉服务该做什么。那么,假设通信仅在本地进行,那么这两个进程的最佳通信方法是什么?
最好的意思是更健壮和更不容易出错,不是最好的性能也不是最容易编码的。
注意我问的是使用什么,标准 TCP 套接字、命名管道或其他一些通信方式。
.Net 中的 IPC 可以通过以下方式实现:
使用命名管道需要 .Net 3.0及更高版本。
.Net 1.0 发布的原始 IPC 框架。我相信远程处理不再被积极开发,我们鼓励您改用 WCF
通过 Remoting 进行进程间通信- 使用 tcp 通道
我最近遇到一个项目,它封装了 Win32 RPC 库并创建了一个可用于本地和远程 RPC 的 .net 类库
项目主页:http ://csharptest.net/projects/rpclibrary/
MSDN 参考资料:
还有一个运行在库之上的 google 协议缓冲区 rpc 客户端:https ://code.google.com/p/protobuf-csharp-rpc/
为了完整起见,也可以使用带有WM_COPYDATA消息的 WIN32 方法。我之前在 .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,您可以获得强大的工具支持和大量可用信息。
我想加入这个讨论。如果这是出路,请责备我-但是信号量(或多个信号量)不能用于基本通信吗?