C# 动态加载Dll

在很多应用程序中有这样的效果,就是某个文件夹下面放入某个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;
                }
            }
        }

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值