这两天在看自定义控件,原来有太多知识没有掌握。今天看到插件机制,心里突然一亮,这个东西听了不少次,就是不知道是啥回事。这次有幸书里包含一个案例,我就跟着它一步步来。终于知道是什么回事了。这个应该在软件开发中非常多见。只是当时不理解罢了。

开始

新建一个winform项目CustomControls
在窗体上放一个button按钮

窗体代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using Plugin;

namespace CustomControls
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnok_Click(object sender, EventArgs e)
{
CreatePlugInDockForm("", "Plugin.Form1", "Plugin");
}

public static void CreatePlugInDockForm(string strPlugInSubFilePath, string strFormFullName, string strAssemblyName)
{
try
{
//项目的Assembly选项名称DockSample.dll 即 DockSample
string path = strAssemblyName;
//类的全路径名称=> “DockSample.Modules.frm班组日志管理”
string name = strFormFullName;
string currentDirectory =
System.IO.Directory.GetCurrentDirectory();
if (strPlugInSubFilePath == "")
{
currentDirectory = currentDirectory + "\\PlugIns";
}
else
{
//同样的dll,可以按照打上客户的名称,然后加载对应客户的dll,这样就可以防止冲突
currentDirectory = currentDirectory + "\\PlugIns" + "\\" +
strPlugInSubFilePath;
}
string[] dllFilenames = System.IO.Directory.GetFiles(currentDirectory,
strAssemblyName + ".dll");
if (dllFilenames.Length == 1)
{
Assembly asm = Assembly.LoadFrom(dllFilenames[0]);
Form frm = (Form)asm.CreateInstance(strFormFullName, true);
//实现PlugIn.ICMFormPlugIn接口
if (frm.GetType().GetInterface(typeof(ICMFormPlugIn).FullName) != null)
{
frm.Show();
}
else
{

MessageBox.Show("没有实现接口");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}

再新建一个Plugin类库项目
加一个接口ICMFormPlugIn
接口代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Plugin
{
public interface ICMFormPlugIn
{
void Show();
void Close();
}
}

在里面再新建一个form1窗体,并继承接口。再拖一个按钮控件
窗体代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Plugin
{
public partial class Form1 : Form,ICMFormPlugIn
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("hello wo shi chajian");
}
}
}

第一个项目要引用后面插件项目,不然在实现接口调用时错误,这个地方
//实现PlugIn.ICMFormPlugIn接口
if (frm.GetType().GetInterface(typeof(ICMFormPlugIn).FullName) != null)
其实也可以直接写
frm.GetType().GetInterface("ICMFormPlugIn")

在CustomControls项目bin里新建一个文件夹,把生成的Plugin.dll文件放入其中。然后运行就有一下效果了

算是完成了。

参考《.NET 控件开发基础》

winform插件机制学习的更多相关文章

  1. kubernetes CSI 插件机制学习笔记

    前言 最近在极客时间订阅了kubernetes的专栏,这篇文章是想记录一下自己学习 CSI 插件机制 (container-storage-interface) 的过程,加深一下记忆. 准备工作 老师 ...

  2. 微信开发学习日记(八):7步看懂weiphp插件机制,核心目标是响应微信请求

    又经过了几个小时的梳理.回顾,截至目前,终于对weiphp这个框架的机制搞明白了些.想要完全明白,自然还需要大把的时间.第1步:   配置微信公众号,http://weiphp.jiutianniao ...

  3. Omi框架学习之旅 - 插件机制之omi-finger 及原理说明

    以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...

  4. Maven生命周期和插件机制

    Maven中的一个非常重要的概念是生命周期和插件,这篇文章重点介绍下Maven的生命周期. Maven的生命周期是抽象的,具体的功能是有具体的插件来完成的,Maven有相当多的功能插件,以至于Mave ...

  5. [转]仿World Wind构造自己的C#版插件框架——WW插件机制精简改造

    很久没自己写东西啦,早该好好总结一下啦!一个大师说过“一个问题不应该被解决两次!”,除了一个好脑筋,再就是要坚持总结. 最近需要搞个系统的插件式框架,我参照World Wind的插件方式构建了个插件框 ...

  6. 探寻 webpack 插件机制

    webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...

  7. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  8. mybatis的插件机制

    一.mybatis的插件介绍 关于mybatis的插件,我想大家也都用过,就比如最常用的逆向工程,根据表结构生成model,dao,xml文件,还有分页插件,那这些插件的工作原理是怎么样的呢,就比如分 ...

  9. 精尽MyBatis源码分析 - 插件机制

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

随机推荐

  1. Sumsets

    题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=91209#problem/A 题意:给定一个整数几何S,找出一个最大的d,使得a ...

  2. TestStand与LabVIEW UI 交互

    交互起因 客户觉得TestStand界面复杂,希望一个简单的界面即可进行序列执行,采用LabVIEW调用TestStand引擎可实现快速设计,将TestStand拆解到LabVIEW.然而,这样做需要 ...

  3. 配置非默认端口的监听Listener

  4. segement fault常见错误

    1.指针赋值前就用它引用内存,或释放后继续访问它的内容. 2.释放同一块内存两次.

  5. hdu 4897 Little Devil I

    传送阵:http://acm.hdu.edu.cn/showproblem.php?pid=4897 题目大意:一棵树,三个操作:1.将某条链取反,2.将与某条链相邻的边取反,3.查询某条链上为1的边 ...

  6. 【iCore3 双核心板】例程三十:U_DISK_IAP_FPGA实验——更新升级FPGA

    实验指导书及代码包下载: http://pan.baidu.com/s/1jH1TiKY iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  7. Run P4 without P4factory - A Simple Example In Tutorials. -2 附 simple_router源码

    /* Copyright 2013-present Barefoot Networks, Inc. Licensed under the Apache License, Version 2.0 (th ...

  8. 3D Touch

    一.认识3D Touch   1.硬件和操作系统要求      iPhone 6s或者iPhone 6s Plus      操作系统要求 ios9+ 2.3D Touch的交互效果 QuickAct ...

  9. Codevs 1299 切水果

    题目链接 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果 ...

  10. 多线程 - CyclicBarrier

    一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarri ...