53

我以前从未在 Windows 上进行过 IPC。我正在开发一对程序、一个标准的 GUI/CLI 应用程序和一个 Windows 服务。该应用程序必须告诉服务该做什么。那么,假设通信仅在本地进行,那么这两个进程的最佳通信方法是什么?
最好的意思是更健壮和更不容易出错,不是最好的性能也不是最容易编码的。

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

4

6 回答 6

73

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

WCF

使用命名管道需要 .Net 3.0及更高版本。

代码示例


远程处理

.Net 1.0 发布的原始 IPC 框架。我相信远程处理不再被积极开发,我们鼓励您改用 WCF

代码示例

通过 Remoting 进行进程间通信- 使用 tcp 通道

资源


Win32 RPC 使用 csharptest-net RpcLibrary

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

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

MSDN 参考资料:

还有一个运行在库之上的 google 协议缓冲区 rpc 客户端:https ://code.google.com/p/protobuf-csharp-rpc/


WM_COPYDATA

为了完整起见,也可以使用带有WM_COPYDATA消息的 WIN32 方法。我之前在 .Net 1.1 中使用过这种方法来创建一个从 Windows 资源管理器打开多个文件的单实例应用程序。

资源

插座

使用自定义协议(更难)

于 2008-09-08T17:08:16.387 回答
7

仅限本地,我们已成功使用命名管道。避免了 TCP 的开销,并且几乎(至少对于 .NET)尽可能高效,同时还有一个不错的 API 可以使用。

于 2008-09-08T17:04:16.677 回答
2

由于您仅限于 .Net 2.0 WCF 可能不是一个选项。您可以使用带有共享内存的 .Net 远程处理作为同一台机器上应用程序域之间的底层通信机制。使用这种方法,您可以轻松地将进程放在不同的机器上,并用网络协议替换共享内存协议。

于 2008-09-08T17:16:59.660 回答
2

与 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/

于 2010-09-08T21:24:17.627 回答
0

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

于 2008-09-08T17:18:28.453 回答
0

我想加入这个讨论。如果这是出路,请责备我-但是信号量(或多个信号量)不能用于基本通信吗?

于 2011-02-11T10:09:12.530 回答