我以前从未在 Windows 上做过 IPC。目前我正在开发两个程序,一个标准 GUI/CLI 应用程序和一个 Windows 服务。应用程序必须告诉服务要做什么。那么,假设通信仅是本地的,那么这两个进程的最佳通信方法是什么?

最佳被定义为更健壮且不易出错,而不是性能最高或最容易编码。

代码示例将非常受欢迎,但不是必需的:-)

注意我问的是使用什么,标准 TCP 套接字、命名管道或其他一些通信方式。

谢谢!

有帮助吗?

解决方案

.Net 中的 IPC 可以通过以下方式实现:

世界碳纤维

使用命名管道 需要.Net 3.0 以上。

代码示例


远程处理

最初的IPC框架随.Net 1.0一起发布。我相信远程处理不再被积极开发,鼓励您改用 WCF

代码示例

通过远程处理进行进程间通信 - 使用 TCP 通道

资源


使用 csharptest-net RpcLibrary 的 Win32 RPC

我最近遇到一个项目,它包装了Win32 RPC库并创建了一个可用于本地和远程RPC的.net类库

项目主页: http://csharptest.net/projects/rpclibrary/

MSDN参考资料:

还有一个在库之上运行的 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。

http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/

最好的选择是使用 WCF。您将能够在 Windows 服务中创建服务主机并公开 GUI 应用程序可以使用的定义良好的接口。如果您选择,WCF 将允许您通过命名管道进行通信,或者您也可以选择任何其他通信协议,如 TCP、HTTP 等。使用 WCF,您可以获得强大的工具支持和大量可用信息。

我想补充一下这个讨论。如果这是可行的,请斥责我 - 但信号量(或多个信号量)不能用于基本通信吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top