最近需要写一个管理程序,因为以后可能需要升级不同功能,因此想只写一个框架界面,以后不同功能和界面以dll插件的形式升级。当框架界面启动时检测到目录下有dll时,就通过不同tab页面加载dll中的功能显示出来。这样如何实现呢?如果有简单示例代码就更好了。谢谢各位了
解决方案 »
- 如何获取c#中webBrowser控件里面的html页面的子页面元素?
- 有没有办法在自己的应用程序中使用网站的搜索功能?
- 怎样在新建的windows应用程序中添加一个数据库呢
- DirectX SDK 是否收费? 有没有其他语音、视频的捕获和压缩的库
- 邮件收发系统的问题
- 快考试了...谁给我点C#的题目
- 谁有 Regulator 这个工具??
- autocompleteextenter读oracle数据库?
- 打开多个窗体的问题。
- 看似简单的正则表达式问题?
- 有没有什么情况,不适合用List<T>而应该用ArrayList的?
- 关于Exchange邮件服务器收取邮件的问题。各位有没有遇到过?求大仙解答
{
var typeName = 查询节点对应的UI类型信息(treeview1.SelectedValue);
var ts = typeName = typeName.Split(',');
var asm = Assembly.LoadFrom(ts[1]);
var ctrl = (UserControl)Activator.CreateInstance(asm.GetType(ts[0]));
Panel1.Controls.Clear();
Panel1.Controls.Add(ctrl);
}而假设你的主程序有A、B、C三类数据资料,你还可以进一步为ctrl按需传入数据资料,例如:void treeview_NodeSelected(object sender, EventArgs e)
{
var typeName = 查询节点对应的UI类型信息(treeview1.SelectedValue);
var ts = typeName = typeName.Split(',');
var asm = Assembly.LoadFrom(ts[1]);
var ctrl = (UserControl)Activator.CreateInstance(asm.GetType(ts[0]));
Panel1.Controls.Clear();
Panel1.Controls.Add(ctrl);
var ca = ctrl as IRequireDatasA;
if(ca !=null)
ca.SetDatas(this.DataA);
var cb = ctrl as IRequireDatasB;
if(cb !=null)
cb.SetDatas(this.DataB);
var cc = ctrl as IRequireDatasC;
if(cc !=null)
vc.SetDatas(this.DataC);
}
根据接口编程,那么你的主程序可以如此这样地捕获 ctrl 的接口,调用其相应的各种方法、属性、事件交互,等等。这个例子实在是太土了。其实越是简单的设计,越难以举例。一个非常基本的设计知识它越是“土”(而不是那种臃肿的时髦框架),你要理解并且使用它就越需要智慧。
代码如下:if (info.Extension.Equals(".ocx")) //如果扩展名为".ocx"
{
//加载控件
Assembly assembly = Assembly.LoadFrom(path + @"/" + info.Name);
//获得类(型)
Type type = assembly.GetType("PluginsModel.PluginControl", false, true);
//设置筛选标志
BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
//调用构造函数并获得对象
Object obj = type.InvokeMember("PluginControl", bflags | BindingFlags.CreateInstance, null, null, new object[] { m_dbAddr , m_dbPort , m_dbUserName , m_dbPassword });
//将对象转换类型
UserControl control = (UserControl)obj;
control.Dock = DockStyle.Fill;
control.Visible = true;
TabPage tmpTabPage = new TabPage(info.Name.Substring(0, (info.Name.Length - 4)));
tmpTabPage.Name = info.Name;
this.MainFormTabControl.Controls.Add(tmpTabPage);
tmpTabPage.Controls.Add(control);
}也就是说每个单独的dll都可以正常加载,但是循环加载后,后面的就不能正常显示了。
但是当加载第二个ocx时,assembly还是加载的1.ocx。所以后面的ocx都显示的是第一个界面。这是为什么呢?
这里的ocx就是dll。做了个扩展名的区别而已。