在Remoting中如何使用接口,恳求高人指点
为了不在客户端放置通用库文件,先定义接口,让通用库继承接口,然后在客户端只使用接口.问题是:在客户端使用通用库时
ClientActivatedType CAObject = new ClientActivatedType();
ILease serverLease = (ILease)RemotingServices.GetLifetimeService(CAObject);
MyClientSponsor sponsor = new MyClientSponsor();
serverLease.Register(sponsor);
是可以通过的,客户端发起租约成功.但,当只引用接口时:
IcskGeneral CAObject ;
CAObject=(IcskGeneral)Activiter.GetObject(TypeOf(IcskGeneral),url);
ILease serverLease = (ILease)RemotingServices.GetLifetimeService(CAObject);
报错:错误 1 与“System.Runtime.Remoting.RemotingServices.GetLifetimeService(System.MarshalByRefObject)”最匹配的重载方法具有一些无效参数
错误2 参数“1”: 无法从“cdling.IcskGeneral”转换为 system.MarshalByRefObject”
报错时光标在GetLifetimeService(CAObject)的CAObject 上.
在任炅的讲座中只提到过,但在示例中都是引用的通用库,请问大师门如何解决,因为我不想把通用库放到客户端去!
------解决方案--------------------试一试:
IcskGeneral CAObject ;
CAObject=(IcskGeneral)Activiter.GetObject(TypeOf(IcskGeneral),url);
//强行转换一下
System.MarshalByRefObject tmp = (System.MarshalByRefObject)CAObject;
ILease serverLease = (ILease)RemotingServices.GetLifetimeService(tmp);
------解决方案--------------------RemotingServices.GetLifetimeService(CAObject);
把GetLifetimeService的参数改成IcskGeneral接口
要搞清楚继承关系ClientActivatedType 能够转化为IcskGeneral
但是IcskGeneral接口不能转换为ClientActivatedType
------解决方案--------------------ClientActivatedType CAObject = new ClientActivatedType();
这里错了.
若要在客户端使用接口,就必须是服务端激活模式.否则客户端怎么知道构造函数的签名呢?!