进程间的通讯——IPC通道

内部进程通讯,是指在同一台计算机当中的不同进程之间进行通讯。

对于两个进程之间的通讯方式有很多种,比如文件共享,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对象就不能跨域,只能简单的在被调用的域内实例化了,也就是别的进程无法访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值