“.net framework下的marshalByRefObject类允许在支持远程处理的应用程序中跨应用程序域边界访问对象”——MSDN。说简单点,通过继承marshalByRefObject类能够实现远程调用。
继承MarshalByRefObject的类能够被远程调用。例如定义了如下的类:
public class AgentObj : MarshalByRefObject
{
...
public static event RunEventHandler RunEvent;
public static event StopEventHandler StopEvent;
public void run()
{
...
RunEvent();
}
public void stop()
{
...
StopEvent();
}
}
注册通道和注册远程对象都通过配置文件完成。在服务器端需要设置事件句柄的值。
AgentObj.RunEvent += new AgentObj.RunEventHandler (OnRun) ;
AgentObj.StopEvent += new AgentObj.StopEventHandler (OnStop) ;
onRun 和 OnStop是两个服务器端的私有方法。此方法将会被客户端调用。注意:remoting调用的不是方法而是对方法的引用。
在客户端通过ConfigurationManager.AppSettings["ServiceURL"] 获得key为ServiceURL的value。ServiceURL保存的是远程URL。
AgentObj app = (AgentObj)Activator.GetObject(typeof(AgentObj), uri.Replace("@machine",ip)) 激活在服务器端的对象。此时在客户端就可以调用AgentObj对象的方法来开始远程调用了。
app.run();
小结:.net 框架提供的MashalByRefObject类实现远程调用非常方便,在使用过程中还需考虑通道的注册方法:分为tcpChannel和httpChannel两种,对象注册方法,激活模式等。