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

关于 反射 接口 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 找出实现类