Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#(.NET2.0)中Windows的进程间通信_C#_.net_Ipc - Fatal编程技术网

C#(.NET2.0)中Windows的进程间通信

C#(.NET2.0)中Windows的进程间通信,c#,.net,ipc,C#,.net,Ipc,我以前从未在Windows上做过IPC。目前,我正在开发一对程序、一个标准GUI/CLI应用程序和一个windows服务。应用程序必须告诉服务该做什么。那么,假设通信仅限于本地,那么对于这两个过程,什么是最好的通信方法 其中,best被定义为更健壮、更不容易出错,而不是性能最好或最容易编码的 代码示例非常受欢迎,但不是必需的:-) 注意,我问的是使用什么,一个标准的TCP套接字,命名管道,或者其他一些通信方式 谢谢 仅在本地,我们成功地使用了命名管道。避免了TCP的开销,并且非常高效(至少对于.

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

其中,best被定义为更健壮、更不容易出错,而不是性能最好或最容易编码的

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

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


谢谢

仅在本地,我们成功地使用了命名管道。避免了TCP的开销,并且非常高效(至少对于.NET而言),同时还可以使用一个像样的API。

IPC在.NET中可以通过以下方式实现:

周转基金 使用命名管道需要.Net 3.0及更高版本

代码示例
  • WCF类NetNamedPipeBinding可用于同一台计算机上的进程间通信。此类的MSDN文档包括一个涵盖此场景的代码示例

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

代码示例 -使用tcp通道

资源
  • GenuineChannel,销售包含共享内存通道的远程处理工具包
  • ,撰写了权威的.Net远程处理书籍

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

项目主页

MSDN参考资料:

  • rpc的工作原理:
  • RPC功能:
还有一个运行在库顶部的google protocol buffers rpc客户端:


WM_COPYDATA 为了完整性,还可以在消息中使用WIN32方法。我以前在.Net 1.1中使用过此方法,创建一个从windows资源管理器打开多个文件的单实例应用程序

资源
插座
使用自定义协议(更难)

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

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

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

如果需要向服务发送复杂对象,则应使用数据库、xml、文件、tcp、http等,而不是发送控制命令,如重新加载配置、处理项目等。应使用此控制代码

还有其他可用功能,例如查询服务。请参阅Windows服务文档和api


我想补充一下这个讨论。如果这是一条出路,请批评我——但一个信号量(或多个信号量)不能用于基本的通信吗?

WCF:就像我被鼓励使用.NET 3.5:)遗憾的是,远程处理似乎不是一个选项。信号量是线程/进程共享内存时使用的一种技术。System.IO.Pipes在.Net 2.0中不可用