C#中的Windows进程间通信(.NET 2.0)
我从来没有必要在Windows上做IPC。 目前我正在开发一对程序,一个标准的GUI / CLI应用程序和一个Windows服务。 该应用程序必须告诉服务该怎么做。 那么,假设通信只是本地的,那么这两个过程最好的沟通方式是什么?
在哪里最好的定义是更强大,更不容易出错,而不是最高性能也最容易编码。
代码示例将非常受欢迎,但不是必需的:-)
注意我正在问什么使用,一个标准的TCP套接字,命名pipe道,或一些其他通信方式只。
谢谢!
.Net中的IPC可以通过以下方式实现:
WCF
使用命名pipe道需要.Net 3.0及以上版本。
代码示例
- WCF类NetNamedPipeBinding可用于同一台计算机上的进程间通信。 此类的MSDN文档包含涵盖此scheme的代码示例http://msdn.microsoft.com/zh-cn/library/system.servicemodel.netnamedpipebinding.aspx
远程处理
最初的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。
你最好的select是使用WCF。 您将能够在Windows服务中创build一个服务主机,并公开一个GUI应用程序可以使用的定义良好的接口。 WCF会让你通过命名pipe道进行通信,如果你select的话,或者你可以select任何其他通信协议如TCP,HTTP等。使用WCF你会得到很好的工具支持和大量的可用信息。
我想补充一下这个讨论。 如果这样的话,请指责我 – 但是不能用信号量(或多个信号量)进行基本的通信?