文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>学习--C# 插件式程序开发

学习--C# 插件式程序开发

时间:2011-06-08  来源:菊花香

      今天在博客园第一次写博,献丑了,有不对的角度,请大家指出并帮忙分析,十分感谢。

      上次看了《C# 插件式程序开发》有关插件模式开发,

  地址:http://www.cnblogs.com/sndnnlfhvk/archive/2011/06/02/2067713.html

  很有兴趣,今天提手在电脑前稍微改了下。

      目录如下(目录结构和《C# 插件式程序开发》类似,只是多加 WindowShow项目,所有需要加载DLL都放在Plugins目录下):

     

    Proplugins为启动项目,主界面基本没变化,在此引用下图片:

    WindowShow生成DLL文件也被保存在Plugins文件夹下,作为插件加载,显示名称为Form3     FormShow显示按钮名称为Form2,之前名称没命名好     Plugins显示按钮名称为Form1,之前名称没命名好     Interfaces目录下是主接口,所有窗体都会实现这个接口中包含方法。   生成DLL文件如下:             AllPlugins.dll含有Form1和Form2        Windowshow.dll 包含Form3

 启动界面显示如下:

        

    来看看点击Form2按钮后效果:(出现窗体2,点击出现对话框,窗体2就是FormShow)

        

            看看Form3效果:窗体3既是WindowShow项目下的Form3                    在主界面显示时,给每个按钮都加了事件,以便点击出现效果:             在界面生成时按钮是如何加载的:
   ///返回Arraylist对象,内包含所有要显示窗体的对象
           list= PluginsIn.instance.Plugins;
for (int i = 0; i < list.Count;i++)
{
Type t=list[i].GetType();
listBox1.Items.Add(t.Name);
                Button bt = new Button();
//bt.Size = new Size(new Point(100, 40));
               //按钮名称以数字形式命名,既list中object的序列
bt.Name = i.ToString();
bt.Text = t.Name;
                //给按钮加入更多内容
//bt.Image=ImageClass.Images.Images[i];
//每个按钮加入事件
bt.Click += new EventHandler(button_Click);
                this.MenuButtonPanel.Controls.Add(bt);
}
        点击按钮后触发内容:

        private void button_Click(object sender, EventArgs e)
        {
            Button b = sender as Button;
            int i=Convert.ToInt32(b.Name);

           // i的值就是list中object
            object obj = list[i];
            Type t = obj.GetType();
            MethodInfo OnShowDlg = t.GetMethod("OnShowDlg");
            OnShowDlg.Invoke(obj, null);
          }

    加载DLL程序:

    public class PluginsIn
    {
        public readonly static PluginsIn instance=new PluginsIn();

        public PluginsIn()
        {
            loadAllPlugins();
        }

        /// <summary>
        /// 存储控件
        /// </summary>
        private ArrayList plugins = new ArrayList();

        public ArrayList Plugins
        {
            get { return plugins; }
        }

        /// <summary>
        /// 载入所有插件
        /// </summary>
        private void loadAllPlugins()
        {
            ///获取插件目录(plugins)所有DLL
            string[] DLLfiles = Directory.GetFiles(Application.StartupPath + @"\Plugins");
            foreach (string file in DLLfiles)
            {
                if (file.ToUpper().EndsWith(".DLL"))
                {
                    try
                    {
                        Assembly ass = Assembly.LoadFrom(file);
                        Type[] types = ass.GetTypes();
                        foreach (Type t in types)
                        {
                            if (t.GetInterface("IMainPlugin") != null)
                            {
                                ///实例化对象
                                plugins.Add(ass.CreateInstance(t.FullName));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }
    }

        以上是实现步骤,欢迎大家指点与评论。

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载