首页 新闻 会员 周边 捐助

WinForm关于接口的问题

0
悬赏园豆:100 [已解决问题] 解决于 2012-11-09 16:15

小公司,最近要把公司用的各个软件集成在一起,类似于插件式的。

现在有主程序(Loader),仅包含动态菜单、加载插件功能。

其他的每个业务上的功能模块都都打包成dll,然后Loader加载DLL,并根据DLL返回的菜单映射列表。

现在的情况是,Loader可以加载功能模块dll,但无法获得dll里Form1所继承的一些属性。

IPlugin.dll包含一个接口IShow,提供窗体的Show和ShowDialog、功能模块信息、菜单列表;包含2个WinForm窗体,其中MainForm作为所有窗体的基类,SubForm继承自MainForm。

功能模块Business.dll里的Form1继承自IPlugin.SubForm且实现IShow,在Loader加载以后

获得的Form无法被转换城IPlugin.SubForm

public partial class Form1 : SubForm,IShow

 

 1 private void LoadAllPlugs()
 2         {
 3             //获取插件目录(plugins)下所有文件
 4             string[] files = Directory.GetFiles(Application.StartupPath + @"\plugins");
 5             foreach (string file in files)
 6             {
 7                 if (file.ToUpper().EndsWith(".DLL"))
 8                 {
 9                     try
10                     {
11                         //载入dll
12                         Assembly ab = Assembly.LoadFrom(file);
13                         Type[] types = ab.GetTypes();
14                         foreach (Type t in types)
15                         {
16                             //如果某些类实现了IShow接口,则认为该类适配与主程序(是主程序的插件)
17                             if (t.GetInterface("IShow") != null)
18                             {
19                                 plugins.Add(ab.CreateInstance(t.FullName));
20                                 object obj = plugins[plugins.Count - 1];
21                                 Type tt = obj.GetType();
22                                 MethodInfo GetModuleName = tt.GetMethod("GetModuleName");
23 
24                                 listBox1.Items.Add(GetModuleName.Invoke(obj, null));
25                             }
26                         }
27                     }
28                     catch (Exception ex)
29                     {
30                         //MessageBox.Show(ex.Message);
31                         throw ex;
32                     }
33                 }
34             }
35         }

获取到的obj类型为Form,基类为SubForm,但是从Form转换成SubForm的时候报错,这要怎么弄啊?

问题补充:

从这里能看出获得的obj的基类是SubForm

但为什么就无法转换呢?

txtName的主页 txtName | 初学一级 | 园豆:9
提问于:2012-11-08 17:31
< >
分享
最佳答案
0

此SubForm非彼SubForm

收获园豆:70
我只是搬运工 | 菜鸟二级 |园豆:308 | 2012-11-09 11:43

代码里用到的SubForm 都是 IPlugin.SubForm

txtName | 园豆:9 (初学一级) | 2012-11-09 11:53

还真是这回事

虽然2个地方引用都是IPlugin.dll,但不是同一个目录下的dll文件

txtName | 园豆:9 (初学一级) | 2012-11-09 16:14
其他回答(3)
0

做一次类型转换试试 如:as SubForm

收获园豆:20
az235 | 园豆:8483 (大侠五级) | 2012-11-08 18:18

SubForm subForm = obj as SubForm;

执行后 subForm是null

支持(0) 反对(0) txtName | 园豆:9 (初学一级) | 2012-11-09 10:57

@txtName: 他们不是派生自同一个类,所以无法转换,或者你用反射直接反射SubForm而不是Ishow接口

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-11-09 14:51
0

做一次类型转换

收获园豆:5
jason2013 | 园豆:1998 (小虾三级) | 2012-11-09 09:04

怎么转换?

1 //subForm是null
2 SubForm subForm = obj as SubForm;
3 
4 //转换失败
5 SubForm subForm = (SubForm)obj;

还有其他什么方法吗?

支持(0) 反对(0) txtName | 园豆:9 (初学一级) | 2012-11-09 10:59
0

mark

收获园豆:5
ms_water | 园豆:510 (小虾三级) | 2012-11-09 10:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册