关于 反射 接口 dll 的问题
在dll中声明一个接口
在dll外用反射调用.如果是直接调用dll里的类的话是可以的。若调用接口,在创建实例时,要进行对象强制转换。此时的接口对象是不存在于dll外的。要怎么进行接口调用?
------解决方案--------------------public static IDALFactory factory;
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel, false);
factory = (IDALFactory)Activator.GetObject(typeof(IDALFactory), serverurl);
以上给楼主作一个参考, factory 是个搂口, 具体实现在远程 服务器. 注意 serverurl.
------解决方案--------------------我应该明白了你的意思!是这样的吗?
你想在客户端不放置真正的远程对象的dll,只放置远程对象dll里面的所有对象的接口 ,这样比较安全,免得被人家看到了真正的对象?
------解决方案--------------------明白了
myDllAssembly.GetType( "IDESCoder "); 有问题
我通过测试,IDESCoder通过GetType后没有对象 ,因为实现这个接口的类型可能很多,你说我返回哪个类型呢
------解决方案--------------------也就是说不能通过一个接口来获得其type,
而可以通过一个类或者一个对象才可以
接口只是标准,不是具体的类型
------解决方案--------------------比如你可以这样把IDESCoder当参数传递近来,可以有客户端调用
public void XXX(IDESCoder ides)
{
IDESCoder a = ides;
}
------解决方案--------------------除非把接口的定义独立成一个dll,然后其它的两个project引用这个接口,这样就可以动态加载dll然后通过接口访问了。
------解决方案--------------------1,你要的函数是非静态的,所以一定要一个对象
2,你的接口实例一直没有过,外部也没有传进来过,也就是实现该接口的类从来没有一个实例化了。
只有接口不能转换成对象==〉接口实例可以转化成实现了该接口的类的对象。
我想应该明白了
------解决方案--------------------反射得到的对象也只能用反射的方法来调用
------解决方案--------------------string filepath = "EncryptService.dll ";
Assembly myDllAssembly = Assembly.LoadFrom(filepath);
Type dllType = myDllAssembly.GetType( "IDESCoder "); <---------
if (dllType!=null)
{
object obj = Activator.CreateInstance(dllType); <--------
MethodInfo mi=dllType.GetMethod( "Method ");
object[] paramArray={};
mi.Invoke(obj, paramArray);
}
------解决方案--------------------那就 GetTypes() 再用 FindInterfaces 找出实现类