日期:2014-05-19  浏览次数:20892 次

在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(); 
这里错了.
若要在客户端使用接口,就必须是服务端激活模式.否则客户端怎么知道构造函数的签名呢?!