小公司,最近要把公司用的各个软件集成在一起,类似于插件式的。
现在有主程序(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的时候报错,这要怎么弄啊?
此SubForm非彼SubForm
代码里用到的SubForm 都是 IPlugin.SubForm
还真是这回事
虽然2个地方引用都是IPlugin.dll,但不是同一个目录下的dll文件
做一次类型转换试试 如:as SubForm
SubForm subForm = obj as SubForm;
执行后 subForm是null
@txtName: 他们不是派生自同一个类,所以无法转换,或者你用反射直接反射SubForm而不是Ishow接口
做一次类型转换
怎么转换?
1 //subForm是null 2 SubForm subForm = obj as SubForm; 3 4 //转换失败 5 SubForm subForm = (SubForm)obj;
还有其他什么方法吗?
mark