我的一个有插件的系统,Application里定义了IPlug接口:
 interface IPlug{
  ....
 }
然后再plugin.dll里面定义 SuperRender:
 public class SuperRender : IPlug {
  ....
 }然后在Application里面动态加载plugin.dll:1 Assembly ass=Assebly.LoadFrom("plugin.dll");
2 Type tp=ass.GetType("SuperRender");
3 ConstructorInfo ctor=tp.GetConstructor(Type.EmptyTypes);
4 object obj=ctor.Invoke(null);
5 IPlug plug=obj as IPlug;结果,在4处设断点,查看obj的类型,为"SuperRender",但执行完5后,plug=null!!
为什么会这样子?为什么?为什么!!!!

解决方案 »

  1.   

    区分两个IPlug接口类型,这是两个不同的类型,虽说定义完全一样。
      

  2.   

    也就是说dll中的IPlug接口不等同于application中的接口定义。
      

  3.   

    但是名字完全一样啊,FullName也完全一样。
    如果这样不行,总有可行的办法吧?
    即:我在Application里定义一接口,然后在PlugIn.dll里实现值,然后再在app里调用以实现插件机制,这种好像很多的呀。
      

  4.   

    to 但是名字完全一样啊,FullName也完全一样。
    如果这样不行,总有可行的办法吧?
    即:我在Application里定义一接口,然后在PlugIn.dll里实现值,然后再在app里调用以实现插件机制,这种好像很多的呀。即使同一个文件而加载到不同的程序集,就属于不同的类型,因此无法直接进行类型转换。
    唯一能进行处理的就是,通过反射来进行操作。
      

  5.   

    至于反射如何调用,可以参看这个帖子中我举的例子
    http://community.csdn.net/Expert/TopicView3.asp?id=5045116
      

  6.   

    你那个例子是直接用Name调用的,最好能直接转换过去调用,否则有IPlugin接口也没用,还不都是直接用字符串Call?
      

  7.   

    to 你那个例子是直接用Name调用的,最好能直接转换过去调用,否则有IPlugin接口也没用,还不都是直接用字符串Call?不是给你说了吗,两个不是同一个类型,无法直接转换。