C#中的Windows进程间通信(.NET 2.0)

我从来没有必要在Windows上做IPC。 目前我正在开发一对程序,一个标准的GUI / CLI应用程序和一个Windows服务。 该应用程序必须告诉服务该怎么做。 那么,假设通信只是本地的,那么这两个过程最好的沟通方式是什么?

在哪里最好的定义是更强大,更不容易出错,而不是最高性能也最容易编码。

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

注意我正在问什么使用,一个标准的TCP套接字,命名pipe道,或一些其他通信方式只。

谢谢!

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

WCF

使用命名pipe道需要.Net 3.0及以上版本。

代码示例


远程处理

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

代码示例

通过Remoting进行的进程间通信 – 使用一个tcp通道

资源

  • GenuineChannels销售一个包含共享内存频道的远程工具包。 http://www.genuinechannels.com/Index.aspx
  • Ingo Rammer写了一本明确的.NET远程处理书“ Advanced .NET Remoting”,第二版

Win32 RPC使用csharptest-net RpcLibrary

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

项目主页 : 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

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


WM_COPYDATA

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

资源

  • MSDN – WM_COPYDATA
  • 代码示例
  • PInvoke.net声明

套接字

使用自定义协议(更难)

对于本地而言,我们已经成功使用命名pipe道。 避免TCP的开销,并且几乎(至less在.NET中)尽可能高效,同时也有一个体面的API可以使用。

由于您仅限于.Net 2.0,WCF可能不是一个选项。 您可以使用.Net远程共享内存作为同一机器上应用程序域之间的基础通信机制。 使用这种方法,您可以轻松地将进程置于不同的机器上,并用networking协议replace共享内存协议。

与Windows服务通信的标准方法是使用服务控制代码。 Windows服务可以接收0到255之间的代码。0-127是为系统保留的。 自定义命令可以使用128到255。

如果你需要发送复杂的对象到服务使用数据库,xml,file,tcp,http等。除了用于发送控制命令(如重新载入configuration,处理项目等)的控制代码之外,还应该使用这些控制代码。

还有其他function可用,如查询服务。 请参阅Windows服务文档和API。

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

你最好的select是使用WCF。 您将能够在Windows服务中创build一个服务主机,并公开一个GUI应用程序可以使用的定义良好的接口。 WCF会让你通过命名pipe道进行通信,如果你select的话,或者你可以select任何其他通信协议如TCP,HTTP等。使用WCF你会得到很好的工具支持和大量的可用信息。

我想补充一下这个讨论。 如果这样的话,请指责我 – 但是不能用信号量(或多个信号量)进行基本的通信?