.net remoting 实现了跨进程对象间的访问(被访问的对象仅限于远程对象),可以作为进程间通信的一种方法。
现在将我理解的整理出来,有不对的地方请指正。文中所提的函数多有重载函数,我只是实验了其中的一种,
所以其它的函数是否也能使用,及如何使用。
文中例子远程对象类如下
1 namespace Remotenamesapce 2 { 3 public class RObjectClass : MarshalByRefObject 4 { 5 public RObjectClass() 6 { 7 8 } 9 } 10 }
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步获得远程对象(实际是一个透明代理对象)后客户端可以像使用本地对象一样使用远程对象了。