C# .net remoting 学习笔记一

.net remoting 实现了跨进程对象间的访问(被访问的对象仅限于远程对象),可以作为进程间通信的一种方法。

现在将我理解的整理出来,有不对的地方请指正。文中所提的函数多有重载函数,我只是实验了其中的一种,

所以其它的函数是否也能使用,及如何使用。

文中例子远程对象类如下

 1 namespace Remotenamesapce
 2 {
 3     public class RObjectClass : MarshalByRefObject
 4     {
 5         public RObjectClass()
 6         {
 7 
 8         }
 9     }
10 }
View Code

1. 使用步骤:(1)定义信道 (2)注册信道 (3)注册远程对象类型。

2. 定义信道 

(1) ChannelServers 信道管理类。信道结构图如下:

其中继承IChannelSender 和 IChannelReceiver的类在客户端和服务端都可以使用。而TcpClientChannel只能在客户端使用。

TcpServerChannel只能在服务端使用。

 (2) 用户可以自定义信道。

3. 注册信道

     ChannelServers.RegisterChannel()将信道注册到.Net Remoting 运行库中。ChannelServiers还可以访问已注册的信道。

4. 注册远程对象类型

    服务端:

   (1)注册服务端激活对象

    RemotingConfiguration.RegisterWellKnownServiceType(typeof(RObjectClass),"strurl",WellKnownObjectMode.SingleCall);

    WellKnownObjectMode.SingleCall : 为每个客户端请求实例化一个远程对象。

    WellKnownObjectMode.Singleton : 每个客户端请求都由同一个对象提供服务。

    (2)客户端激活对象 当希望客户端的操作是有状态的时候,可以考虑使用这种对象。

            RemotingConfiguration.ApplicationName = "strurl"; // msdn上说是获取或设置远程处理应用程序的名称,我将其理解成

远程对象在信道中的名称。

     RemotingConfiguration.RegisterActivatedServiceType(typeof(RObjectClass));

     客户端:

      (1)获取服务器激活的远程对象

    方法一:使用Activator.GetObject; 例如:

          RObjectClass obj = (RObjectClass)Activator.GetObject(typeof(RObjectClass),"tcp://localhost:8085/strurl");

           方法二:使用RemotingServices.Connect, 例如:

          RObjectClass obj = (RObjectClass)RemotingServices.Connect(typeof(RObjectClass), "tcp://localhost:8085/strurl");

           方法三:使用使用new ,例如:

           RemotingConfiguration.RegisterWellKnownClientType(typeof(RObjectClass), "tcp://localhost:8085/strurl");

           RObjectClass obj = new RObjectClass();

      (2)激活客户端激活对象

           方法一:使用Activator.CreateInstance ,例如:

           object[] attrs = { new UrlAttribute("tcp://localhost:8085/strurl")};

           ObjectHandle handle = Activator.CreateInstance("Remotenamesapce", "Remotenamesapce.RObjectClass", attrs);

           RObjectClass obj = (RObjectClass)handle.Unwrap();

           // 其中Remotenamesapce为命名空间名字,也为程序集名称。

           方法二:使用new ,例如:

           RemotingConfiguration.RegisterActivatedClientType(typeof(RObjectClass), "tcp://localhost:8085/strurl");

           RObjectClass obj = new RObjectClass();

 5. 在客户端经过第4步获得远程对象(实际是一个透明代理对象)后客户端可以像使用本地对象一样使用远程对象了。

原文地址:https://www.cnblogs.com/sunleinote/p/3091200.html