zoukankan      html  css  js  c++  java
  • 也来学学插件式开发

    上一家公司有用到插件式开发来做一个工具箱,类似于QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了。可惜在那家公司待的时候有点短,没有好好研究一下。现在有空,自己在网上找了些资料,也来试试。

     主要思路:公开一个插件接口,如果.DLL或.EXE的代码中有继承这个接口就将其示为插件,并将这些插件放在同一目录。运行程序的时候扫描目录并通过反射判断.DLL或.EXE中是否存在该接口,若存在,则当作插件加载进来。

    我们来做一个示例看看。例子也是在园子里找的,自己改了一下,详见:http://www.cnblogs.com/xianhong/archive/2011/03/18/1988191.html

    1 建立一个WinForm宿主容器。

    2 定义插件接口。

     接口定义的很简单,就两个属性,一个是插件要显示的第一个界面,第二个是插件的图标。当然,根据业务需求你可以加很多其它信息。

    复制代码
       public interface Iplugin
        {
            //设置加载的主窗体
            Form MainForm
            {
                get;
            }
    
            //插件显示图片
            Image ModulePicture
            {
                get;
            }
        }
    复制代码

     3 定义加载插件的方法。

    复制代码
        public static class PluginLoader
        {
    
            public static List<Iplugin> plugins = new List<Iplugin>();
    
    
            /// <summary>
            /// 判断DLL中是否继承了Iplugin接口
            /// </summary>
            /// <param name="t"></param>
            /// <returns></returns>
            private static bool IsValidPlugin(Type t)
            {
                bool ret = false;
                Type[] interfaces = t.GetInterfaces();
                foreach (Type theInterface in interfaces)
                {
                    if (theInterface.FullName == "PluginDemo.Interface.Iplugin")
                    {
                        ret = true;
                        break;
                    }
                }
                return ret;
            }
    
            /// <summary>
            /// 加载插件,这里是在Debug的plugin目录中搜索插件
            /// </summary>
            public static void LoadAllPlugins()
            {
                string[] files = Directory.GetFiles(Application.StartupPath + "\\plugin\\");
                int i = 0;
    
                foreach (string file in files)
                {
                    string ext = file.Substring(file.LastIndexOf("."));
                    if (ext != ".dll") continue;
                    try
                    {
    // 加载插件 Assembly tmp
    = Assembly.LoadFile(file); Type[] types = tmp.GetTypes(); bool ok = false; foreach (Type t in types) if (IsValidPlugin(t)) {
    // 通过反射实例化 Iplugin plugin
    = (Iplugin)tmp.CreateInstance(t.FullName); plugins.Add(plugin); ok = true; if (ok) break; } } catch (Exception err) { throw err; } } } }
    复制代码

    4 显示插件

     显示插件的方法,主要是显示插件的主界面就可以了。

    复制代码
     /// <summary>
            /// 初始化插件,显示在列表中
            /// </summary>
            /// <param name="plugin"></param>
            private void InitModule(Iplugin plugin)
            {
                PictureBox picture = new PictureBox();
                picture.BackColor = System.Drawing.Color.Red;
    
                picture.Image = plugin.ModulePicture;
                picture.InitialImage = null;
                picture.Dock = DockStyle.Left;
    
                picture.Size = new System.Drawing.Size(65, 71);
                picture.TabStop = false;
                panel1.Controls.Add(picture);
                //单击时加载插件主界面
                picture.Click += (sender, e) =>
                {
                    LoadFrm(plugin.MainForm);
                };
            }
    
            /// <summary>
            /// 加载插件主界面
            /// </summary>
            /// <param name="frm"></param>
            public void LoadFrm(Form frm)
            {
                frm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                frm.ShowIcon = false;
                frm.ShowInTaskbar = false;
                frm.BackColor = Color.White;
                //要将是否顶级控件设置为false,否则会报错
                frm.TopLevel = false;
                frm.Dock = DockStyle.Fill;
                TabPage tab = new TabPage(frm.Name);
                tab.Controls.Add(frm);
                tabControl1.TabPages.Add(tab);
                tab.Show();
                frm.Show();
                frm.BringToFront();
                frm.Focus();
            }
    复制代码

     5 增加插件

     前期准备差不多了,现在我们新建一个插件来测试一下:一个简单的显示当前时间的界面。新建一个类库项目,添加一个Windows窗体,然后拉一个textbox,在后台将textboxt的文本设置为当前时间。

           private void TimeTip_Load(object sender, EventArgs e)
            {
                textBox1.Text = DateTime.Now.ToString();
            }

    生成项目,将输出路径改到上一个项目中的Debug中的plugin目录中。

    运行项目后效果如图:

    我们已经检测到该插件了。点击后就会加载该插件。

     我们要增加一个显示日期的插件:DataPicker

    加载后效果如图:

    示例代码下载:点我

    如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)
     
     
    标签: WinForm
  • 相关阅读:
    codeforces C. Fixing Typos 解题报告
    codeforces B. The Fibonacci Segment 解题报告
    codeforces B. Color the Fence 解题报告
    codeforces B. Petya and Staircases 解题报告
    codeforces A. Sereja and Bottles 解题报告
    codeforces B. Levko and Permutation 解题报告
    codeforces B.Fence 解题报告
    tmp
    API 设计 POSIX File API
    分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2919210.html
Copyright © 2011-2022 走看看