在很多应用程序中有这样的效果,就是某个文件夹下面放入某个dll,这个软件就会把此Dll显示出来。效果图如下
这个效果在C#里面实现起来非常简单
foreach (var name in projectsname)
{
ToolStripMenuItem mi = new ToolStripMenuItem(name);
mi.Name = name;
mi.Text = name;
mi.Click += new EventHandler(createProjectUI);
projectToolStripMenuItem.DropDownItems.Add(mi);
}
ToolStripMenuItem deletefile = new ToolStripMenuItem("Delete Current Project File");
deletefile.Click += new EventHandler(deleteProjectFile);
deletefile.Visible = false;
projectToolStripMenuItem.DropDownItems.Add(deletefile);
projectToolStripMenuItem.Click += delegate (object o, EventArgs en)
{
if(filename != null)
deletefile.Visible = true;
};
Assembly assembly = null;
string windowsPath = Application.StartupPath;
int count = 0;
foreach (string dllFile in Directory.GetFiles(windowsPath, "*.dll"))
{//此处会便利当前文件夹下所有的dll文件
assembly = Assembly.LoadFile(dllFile);
Type[] types = assembly.GetTypes();
foreach (Type t in types)
{
if (t.BaseType == typeof(Form))//通过反射的方式去过滤dll是否包含自己需要的元素
{
this.formTypes.Add(t);
ToolStripMenuItem tsmi = new ToolStripMenuItem();
tsmi.Text = t.Name;
tsmi.Tag = count;
this.loadToolStripMenuItem.DropDownItems.Add(tsmi);
tsmi.Click += new EventHandler(menuItemNewItem_Click);
count = count + 1;
}
}
}
以上是我一个项目中的代码,中间包含了一些菜单的事件,菜单事件涉及到我项目中的东西,此处也就不隐藏了,大家仅当参考啦
private void menuItemNewItem_Click(object sender, EventArgs e)
{
//MenuItem item = (MenuItem)sender;
ToolStripMenuItem itemm = (ToolStripMenuItem)sender;
Type t = (Type)(this.formTypes[(int)itemm.Tag]);
Object obj = Activator.CreateInstance(t);
this.formObjects.Add(obj);
formNum += 1;
t.InvokeMember("MdiParent", BindingFlags.SetProperty, null, obj, new object[] { this });
t.InvokeMember("Text", BindingFlags.SetProperty, null, obj, new object[] { t.FullName + " 窗体:" + formNum });
t.InvokeMember("Show", BindingFlags.InvokeMethod, null, obj, new object[] { });
((Form)obj).Closing += new CancelEventHandler(FrmWindow_Closing);
((Form)obj).Activated += new EventHandler(FrmWindow_Activated);
ToolStripMenuItem tsmi = new ToolStripMenuItem();
//this.loadToolStripMenuItem.DropDownItems.Add(((Form)obj).Text);
tsmi.Click += new EventHandler(menuItemWindow_Click);
this.pnlNum.Text = "当前装载了" + this.formObjects.Count + "个窗体";
this.pnlInfo.Text = "当前活动窗体:" + this.ActiveMdiChild.Text;
}
private void menuItemWindow_Click(object sender, System.EventArgs e)
{
MenuItem item = (MenuItem)sender;
((Form)(this.formObjects[item.Index - 4])).Activate();
this.pnlNum.Text = "当前装载了" + this.formObjects.Count + "个窗体";
this.pnlInfo.Text = "当前活动窗体:" + this.ActiveMdiChild.Text;
}
private void FrmWindow_Activated(object sender, System.EventArgs e)
{
this.pnlNum.Text = "当前装载了" + this.formObjects.Count + "个窗体";
this.pnlInfo.Text = "当前活动窗体:" + this.ActiveMdiChild.Text;
}
private void FrmWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
for (int i = 0; i < this.formObjects.Count; i++)
{
if (((Form)this.formObjects[i]).Text == ((Form)sender).Text)
{
this.formObjects.RemoveAt(i);
//this.mnuItemWindow.MenuItems.RemoveAt(i + 4);
this.pnlNum.Text = "当前装载了" + this.formObjects.Count + "个窗体";
this.pnlInfo.Text = "关闭窗体:" + this.ActiveMdiChild.Name;
break;
}
}
}