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

开始

新建一个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. [LintCode] 3Sum 三数之和

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  2. 1021上课演练----SQL注入与避免(银行系统)

    package com.bank; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Dat ...

  3. javax.servlet.jsp cannot be resolved to a type

    参考链接 :http://www.tuicool.com/articles/7Njmqy

  4. awesome-scala

    https://github.com/lauris/awesome-scala Awesome Scala  A community driven list of useful Scala libra ...

  5. Web前端开发基础 第四课(盒代码模型)

    盒模型代码简写 还记得在讲盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左.具体应用在margin和paddin ...

  6. Jenkins中Jelly基础、超链接、国际化

    Jelly基础 参考:https://wiki.jenkins-ci.org/display/JENKINS/Basic+guide+to+Jelly+usage+in+Jenkins UI Samp ...

  7. flush vs ob_flush

    刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等).该函数将当前为止程序的所有输出发送到用户的浏览器. flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响. ...

  8. symmetric multiprocessor

    https://en.wikipedia.org/wiki/Symmetric_multiprocessor_system A symmetric multiprocessor system (SMP ...

  9. MEMORY Storage Engine MEMORY Tables TEMPORARY TABLE max_heap_table_size

    http://dev.mysql.com/doc/refman/5.7/en/create-table.html You can use the TEMPORARY keyword when crea ...

  10. c语言的输入输出函数

    参考文章: http://blog.sina.com.cn/s/blog_784f40b80100psg9.html C语言输入输出函数分为两类: 1.格式化输入输出函数 2.非格式化输入输出 --- ...