内部进程通讯,是指在同一台计算机当中的不同进程之间进行通讯。
对于两个进程之间的通讯方式有很多种,比如文件共享,Socket通讯,管道等,这里主要讲的是通过IPC Channel的方式
主要用到的命名空间有以下几个:
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
ipc管道通讯主要分为:客户端,服务端,通讯对象三个方面。
对于服务端来说:
<pre name="code" class="csharp">IpcServerChannel channel = new IpcServerChannel("MyServerChannel");//新建一个服务端通道
ChannelServices.RegisterChannel(channel, false); //将通道注册
RemotingConfiguration.RegisterWellKnownServiceType(typeof(DataObj), "DataObj", WellKnownObjectMode.Singleton);//配置远程连接方式
其中,在配置方法当中,RegisterWellKnownServiceType调用非常重要,因为它告诉远端库它所能提供的对象和这些对象的URI。在上面代码的调用中,我们提供了一个DataObj对象。这个对象完整的URI近似于下面的地址,实际上这也是客户端用来连接服务端的URI:
ipc://MyServerChannel/DataObj
第三个参数代表处理每一个远程请求的时候,服务端提供的是同一个对象(WellKnownObjectMode.Singleton)还是针对每一个请求新建一个对象提供服务(WellKnownObjectMode.SingleCall)
对于客户端来说:
<pre name="code" class="csharp">IpcClientChannel clientChannel = new IpcClientChannel();
ChannelServices.RegisterChannel(clientChannel, false);
RemotingConfiguration.RegisterWellKnownClientType(typeof(DataObj),"ipc://MyServerChannel/DataObj");
大体的注册流程是一样的,然后在对DataObj进行调用之前,记得要先新建一个对象
DataObj obj = new DataObj();
然后就可以直接调用服务端进程方面传来的参数或者是方法了
对于要传输的通讯对象:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Data
{
public class DataObj : MarshalByRefObject
{
static string data;
public string Data
{
get
{
return data;
}
set
{
data = value;
}
}
}
}
我们可以看到,它是继承MarshalByRefObject类的,如果不继承这个类的话,DataObj对象就不能跨域,只能简单的在被调用的域内实例化了,也就是别的进程无法访问。