简单定义:

插件(也称构件)式开发;主要内容就是一个宿主程序加上后期开发的若干插件程序构成整个系统!

宿主程序提供接口注册,插件注册实现接口,从而使不同的插件提供新的功能;

举例:

以下是用VS中的Winform以插件的思想开发的例子;

一:通信接口

  1.打开VS-文件-其他项目类型-VisualStudio解决方案-空白解决方案;

  2.鼠标右键-解决方案-添加-新建项目,选择-类库-命名为:PluginInterface

  3.鼠标右键-类库PluginInterface-添加-新建项-接口-命名为:IShow.cs

  4.IShow.cs中的代码:

using System.Text; 
namespace PluginInterface 
    public interface IShow 
    
      void Show(); 
    
}

  5.鼠标右键-类库PluginInterface-重新生成;

  6.生成后会在该“输出”中看到该接口dll文件的生成路径(该dll文件会在后面新建的宿主程序中引用);

   
   此接口包含了主界面程序(宿主程序)中所包含的所有内容,比如菜单,工具
栏,tabcontrol,tabpage等。

   是所有插件与主界面程序通信的公共契约,该接口包含的仅仅是一些属性,

   而插件就是通过这些属性,与主界面进行交互的。

二:主程序(宿主)

  1.鼠标右键-解决方案-添加-新建项目,选择-Windows窗体应用程序-命名为:Mainform
  2.将Mainform下的Form1改名为Mainform;
  3.右键-Mainform下的-引用-添加引用;
  
  4.项目-解决方案-选中PluginInterface-浏览
  
  5.选中dll文件-添加
  
 
  6.Mainform窗体中拖入控件Listbox;
  
  7.Mainform.cs(Mainform窗体后台)中代码如下(注意using PluginInterface;
  using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PluginInterface;
using System.Reflection;

namespace MainForm
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();//初始化窗体
            try
            {
                //获取当前程序启动的路径(exe所在路径)
                string path = Application.StartupPath;
                //当前路径中的Plugins目录下(path+Plugins)
                path = System.IO.Path.Combine(path, "Plugins");
                //遍历该目录下所有的dll文件(包含路径)
                foreach (string file in System.IO.Directory.GetFiles(path, "*.dll"))
                {
                    //取最后一个'\'符号后面的1个字符,添加到listBox1集合中
                    listBox1.Items.Add(file.Substring(file.LastIndexOf("\\") + 1));
                }

//+=表示listBox1的Click事件订阅(除了它本身所具有的单机功能外,还可以执行你自己定义的方法)
                //了你自定义的listBox1_Click方法,它会去执行你自定义的方法listBox1_Click()
                listBox1.Click += new EventHandler(listBox1_Click);//委托
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        /// <summary>
        /// 被订阅的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listBox1_Click(object sender, EventArgs e)
        {
            string asmFile = listBox1.SelectedItem.ToString();//获取到当前选中项
            string asmName = System.IO.Path.GetFileNameWithoutExtension(asmFile);
            if (asmFile != string.Empty)
            {
                Assembly a = Assembly.LoadFrom("Plugins\\" + asmFile);
                System.Type[] types = a.GetTypes();
                foreach (System.Type type in types)
                {
                    // 校验加载的 dll 是否实现了契约,当然此处也可以用 Attribute 来实现
                    if (type.GetInterface("IShow") != null)
                    {
                        IShow plugin = (IShow)Activator.CreateInstance(type);
                        plugin.show();
                    }
                }
            }
        }
    }
}

  8.右键-解决方案下的Mainform项目-重新生成,在-输出-中根据该路径找到计算机中对应Mainform.exe所在文件夹,
   在该文件夹下新建Plugins文件夹;
    
  以上便是宿主程序的定义,Plugins文件夹中将要存放的就是后期开发的插件(构件)生成的dll文件,
  以后运行Mainform.exe程序的时候就会检索Plugins文件夹中的插件.dll,实现宿主程序中插件功能的添加;

三:插件A(构件A)的开发

  1.鼠标右键-解决方案-添加-新建项目,选择-Windows窗体应用程序-命名为:plugA

  2.将plugA下的Form1改名为plugAForm
  3.应用PluginInterface.DLL文件,与宿主程序中的引用一样;
  4.在plugAForm窗体中添加Lable控件;
  5.plugAForm.cs的后台代码(注意using PluginInterface;)
using System.Text; 

using PluginInterface;
namespace PlugA 

    public class PlugAEnter:IShow 

    
        public void Show() 
        
           new PlusAForm(" 这是 PlugAForm 插件的内容! " ).Show(); 
        
    
      6.右键-解决方案下的plugA项目-重新生成,在-输出-中根据该路径找到计算机中对应的plugA.dll文件;
  7.拷贝plugA.dll文件到Mainform.exe所在文件夹的Plugins文件夹下;

四:插件B(构件B)的开发

  1.与插件A一样,只需将A改成B;

五:运行

  1.在本地资源管理器中找到Mainform.exe,双击运行,
  2.Mainform.exe会到Plugins文件夹下寻找到所有的.dll文件并对其注册,加载到主程序的Listbox中;
  3.点击Listbox框中的PlugA,PlugB即能看到效果!

VS中以插件开发的思想开发Winform应用的更多相关文章

  1. 循序渐进开发WinForm项目(6)--开发使用混合式Winform模块

    1.Winform数据访问模式定义 传统的Winform程序模块:用于传统的数据库通讯获取数据,这种方式获取数据,方便快捷,可以用于常规的业务系统的场景,用于单机版软件或者基于局域网内的业务系统软件. ...

  2. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  3. 循序渐进开发WinForm项目(4)--Winform界面模块的集成使用

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  4. 循序渐进开发WinForm项目(3)--Winform界面层的项目设计

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  5. 循序渐进开发WinForm项目(2)--项目代码的分析

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  6. ABP中的依赖注入思想

    在充分理解整个ABP系统架构之前首先必须充分了解ABP中最重要的依赖注入思想,在后面会具体举出一些实例来帮助你充分了解ABP中的依赖注入思想,在了解这个之前我们首先来看看什么是依赖注入?来看看维基百科 ...

  7. 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型

    # -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...

  8. 使用efwplusScript开发Winform程序【像小程序那样开发PC软件】

    一.前言 本人从事多年医疗管理软件的开发,在医院大多数的软件都还是CS程序,BS程序很少,对于使用者来说CS的操作体验确实比BS的要好. 1.CS的缺点就是升级麻烦,每次有新版本都需要所有客户端操作升 ...

  9. 三、利用EnterpriseFrameWork快速开发Winform系统(C/S)

    EnterpriseFrameWork框架实例源代码下载: 实例下载 上一章讲解了开发Web系统的详细步骤,以书籍的管理作实例实现对书籍的增.删.改.查功能,本章接着上面的实例继续补充用Winform ...

随机推荐

  1. 【EOJ Monthly 2018.2 (Good bye 2017)】

    23333333333333333 由于情人节要回家,所以就先只放代码了. 此题是与我胖虎过不去. [E. 出老千的 xjj] #include<cstdio> #include<c ...

  2. 疯狂LCM

    传送门 题目要求求: \[\sum_{i=1}^nlcm(i,n)\] 先转化成gcd处理: \[n\sum_{i=1}^n\frac{i}{gcd(i,j)}\] 之后老套路 枚举gcd,并且先把d ...

  3. Tensorflow和Caffe 简介

    TensorFlow TensorFlow 是相对高阶的机器学习库,用户可以方便地用它设计神经网络结构,而不必为了追求高效率的实现亲自写 C++或 CUDA 代码.它和 Theano 一样都支持自动求 ...

  4. 移植最新版libmemcached到VC++的艰苦历程和经验总结(上)

    零.前言: 该篇博客的Title原计划是“在VC++中调用libmemcached的设计技巧”,可结果却事与原违,原因很简单,移植失败了.尽管结果如此,然而这3天的付出却是非常值得的,原因也很简单,收 ...

  5. 十张Gif动图让你弄懂递归等概念

    图像(包括动图)是传递信息的一种高效方式,往往能增强表象.记忆与思维等方面的反应强度.所谓一图胜千言,说的就是这个道理. 今天为大家整理了十张动图GIFS,有助于认识循环.递归.二分检索等概念的具体运 ...

  6. bzoj3676

    后缀自动机+manacher 听说本质不同的回文串只有O(n)个 那么用manacher求出所有回文串,然后在sam上查找出现了几次就行了 sam的性质又忘了... manacher也忘了... #i ...

  7. Kefa and Watch

    题意: 维护一个长度为n的字符串,两种操作: 1.将 [l,r] 的字符变为 c 2.询问 d 是否为 $S(l,r)$ 的周期 解法: 首先分析如何令 [l,r] 的周期为d,利用循环串的性质得: ...

  8. python-codecs.open()使用举例

    代码: import codecs from unidecode import unidecode def main(): fullFilename="123.txt" inFID ...

  9. 51nod1414【思维】

    思路: 直接可以枚举1-n,如果枚举到是n的约数i,那么暴力枚举起点,其余点用i累加就一定是正多边形.复杂度是(n*n的公约数个数(最多80)): const int N=2e4+10; int a[ ...

  10. Codeforces482B【线段树构造】

    题意: 有M个限制,每个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是否有满足的数列. 思路: 看到大牛说是线段树,线段树对于区间操作,印象中乘啊,+啊,-啊都不错,但是并没有就是 ...