VS中以插件开发的思想开发Winform应用
简单定义:
插件(也称构件)式开发;主要内容就是一个宿主程序加上后期开发的若干插件程序构成整个系统!
宿主程序提供接口注册,插件注册实现接口,从而使不同的插件提供新的功能;
以下是用VS中的Winform以插件的思想开发的例子;
一:通信接口
1.打开VS-文件-其他项目类型-VisualStudio解决方案-空白解决方案;
2.鼠标右键-解决方案-添加-新建项目,选择-类库-命名为:PluginInterface;
3.鼠标右键-类库PluginInterface-添加-新建项-接口-命名为:IShow.cs
4.IShow.cs中的代码:
usingSystem.Text;namespacePluginInterface{publicinterfaceIShow{voidShow();}}
5.鼠标右键-类库PluginInterface-重新生成;
6.生成后会在该“输出”中看到该接口dll文件的生成路径(该dll文件会在后面新建的宿主程序中引用);

此接口包含了主界面程序(宿主程序)中所包含的所有内容,比如菜单,工具
栏,tabcontrol,tabpage等。
是所有插件与主界面程序通信的公共契约,该接口包含的仅仅是一些属性,
而插件就是通过这些属性,与主界面进行交互的。
二:主程序(宿主)



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();
}
}
}
}
}
}
Plugins文件夹;
Plugins文件夹中将要存放的就是后期开发的插件(构件)生成的dll文件,Plugins文件夹中的插件.dll,实现宿主程序中插件功能的添加;三:插件A(构件A)的开发
1.鼠标右键-解决方案-添加-新建项目,选择-Windows窗体应用程序-命名为:plugA;
using PluginInterface;)usingSystem.Text;usingPluginInterface;namespacePlugA{
publicclassPlugAEnter:IShow{publicvoidShow(){newPlusAForm(" 这是 PlugAForm 插件的内容! ").Show();}}}
Plugins文件夹下;
四:插件B(构件B)的开发
1.与插件A一样,只需将A改成B;
五:运行
Plugins文件夹下寻找到所有的.dll文件并对其注册,加载到主程序的Listbox中;VS中以插件开发的思想开发Winform应用的更多相关文章
- 循序渐进开发WinForm项目(6)--开发使用混合式Winform模块
1.Winform数据访问模式定义 传统的Winform程序模块:用于传统的数据库通讯获取数据,这种方式获取数据,方便快捷,可以用于常规的业务系统的场景,用于单机版软件或者基于局域网内的业务系统软件. ...
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 循序渐进开发WinForm项目(4)--Winform界面模块的集成使用
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 循序渐进开发WinForm项目(3)--Winform界面层的项目设计
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 循序渐进开发WinForm项目(2)--项目代码的分析
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- ABP中的依赖注入思想
在充分理解整个ABP系统架构之前首先必须充分了解ABP中最重要的依赖注入思想,在后面会具体举出一些实例来帮助你充分了解ABP中的依赖注入思想,在了解这个之前我们首先来看看什么是依赖注入?来看看维基百科 ...
- 采用boosting思想开发一个解决二分类样本不平衡的多估计器模型
# -*- coding: utf-8 -*- """ Created on Wed Oct 31 20:59:39 2018 脚本描述:采用boosting思想开发一个 ...
- 使用efwplusScript开发Winform程序【像小程序那样开发PC软件】
一.前言 本人从事多年医疗管理软件的开发,在医院大多数的软件都还是CS程序,BS程序很少,对于使用者来说CS的操作体验确实比BS的要好. 1.CS的缺点就是升级麻烦,每次有新版本都需要所有客户端操作升 ...
- 三、利用EnterpriseFrameWork快速开发Winform系统(C/S)
EnterpriseFrameWork框架实例源代码下载: 实例下载 上一章讲解了开发Web系统的详细步骤,以书籍的管理作实例实现对书籍的增.删.改.查功能,本章接着上面的实例继续补充用Winform ...
随机推荐
- MTK USB 子系统
一.USB 子系统初始化 1. kernel/drivers/usb/core/usb.c subsys_initcall(usb_init); static int __init usb_init( ...
- linux下监控用户的操作记录---录像播放性质
想知道用户登陆系统后都操作了什么,怎么办? 别急,linux下有一个script工具,专门记录终端会话中所有输入输出结果,并存放到指定文件中. 先看看怎么录制吧! 1.创建日志存放目录 # mkdir ...
- Dynamic Gcd
树链剖分+差分 直接区间加显然是不行的,由于gcd(a,b,c)=gcd(a,a-b,b-c),那么我们对这些数差分,然后就变成单点修改.原本以为这道题很简单,没想到这么麻烦,就膜了发代码. 首先我们 ...
- EF之贪婪加载和延迟加载
这篇文章将讨论查询结果的控制 在使用EF(Entity Framework)的过程中,很多时候我们会进行查询的操作,因此知道哪些数据会被加载到内存当中就至关重要.在多多的情况下,你可能并并不需要加载全 ...
- kvm详细介绍
KVM详解,太详细太深入了,经典 2016-07-18 19:56:38 分类: 虚拟化 原文地址:KVM详解,太详细太深入了,经典 作者:zzjlzx KVM 介绍(1):简介及安装 http:// ...
- dubbo项目中包的依赖说明
依赖 (+) (#) 必需依赖 JDK1.5+ 理论上Dubbo可以只依赖JDK,不依赖于任何三方库运行,只需配置使用JDK相关实现策略. 缺省依赖 通过mvn dependency:tree > ...
- secureCRT访问centOS中文系统乱码问题
第一种修改linux和crt的编码方式为utf-8 第二种修改linux和crt的编码为GB2312, 重要!!!crt字体要改成新宋体,同时字符集要改为GB2312 加上最后一项后,成功解决了中文乱 ...
- easyui datagrid 列对不齐
function initBIRDataGrid(id,cols){ $('#basicTable').datagrid({ //列表区域 pageList: [5, 10, 15], fit:tru ...
- ruby版本错误的解决方法
创建: 2018/09/18 完成: 2018/09/18 现在基本上不怎么开新博文了,目前着手的几个方面现有的博文已经全面覆盖.基本上都是更新原博,毕竟融合在一个页面里面方便自己工作使用. 遇到一些 ...
- lightoj 1027【数学概率】
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e2+10; int ma ...