winform插件机制学习

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

开始

新建一个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 控件开发基础》

时间: 2024-10-27 05:30:06

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

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

又经过了几个小时的梳理.回顾,截至目前,终于对weiphp这个框架的机制搞明白了些.想要完全明白,自然还需要大把的时间.第1步:   配置微信公众号,http://weiphp.jiutianniao.com/ ... .html  从上面这个配置可以看出,微信请求呗weiphp的入口文件index.php接收了,可能会被/home/weixin/index/这个action响应.第2步:   index.php入口文件,校验了是否是微信请求.   /** * 微信接入验证 * 在入口进行验证而

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

很久没自己写东西啦,早该好好总结一下啦!一个大师说过“一个问题不应该被解决两次!”,除了一个好脑筋,再就是要坚持总结. 最近需要搞个系统的插件式框架,我参照World Wind的插件方式构建了个插件框架,可以参照<WorldWind学习系列五:插件加载过程全解析>,下面与大家分享一下. 初始化时,加载前面两个插件,可以动态加载KeyBoarderLoader,如下图: 该插件框架是WW插件框架的精简改造版,非常适用于插件式系统开发,也希望帮助大家学习一下WW的插件加载机制. 缺陷在于:未实现事

从npm tips到express插件机制设计

大部分时间,我们只用到npm的install,init,publish等功能,但它设计的非常好,有很多是我们不了解的 一起看一下 全局命令 用nodejs来写cli工具是非常爽的,我干了不少这样的事儿 kp =kill by port je = json editor mh = start mongo here 核心就是在package.json里配置 "preferGlobal": "true", "bin": { "mh"

MyBatis 源码分析 - 插件机制

1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 MyBatis 为例,我们可基于 MyBatis 插件机制实现分页.分表,监控等功能.由于插件和业务无关,业务也无法感知插件的存在.因此可以无感植入插件,在无形中增强功能. 开发 MyBatis 插件需要对 MyBatis 比较深了解才行,一般来说最好能够掌握 MyBatis 的源码,门槛相对较高.本篇

基于接口的插件机制

一.前言 插件,意味着可扩展,且宿主程序不依赖于插件,即插即用.这种软件设计方式可以使我们的应用程序最大化地获得可扩展性.适应性和稳定性,而且便于软件的维护和升级.在什么场景下使用插件呢?例如在本篇文章中,我个人有一个小需求就是希望记事本带行号,于是我自己写了一个极简易的编辑器(CodeEditor),以这个编辑器为例,主体程序功能包括常见的新建.复制.查找.保存等已经完成,但是在使用的过程中发现需要用到 格式化 这个功能,但是我还不想再去改主程序,这种情形下就可以通过插件来实现,这样以后在使用

php中的钩子(hook插件机制)

对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下. hook插件机制的基本思想: 在项目代码中,你认为要扩展(暂时不扩展)的地方放置一个钩子函数,等需要扩展的时候,把需要实现的类和函数挂载到这个钩子上,就可以实现扩展了. 思想就是这样听起来比较笼统,看一个网上的实现的例子. 整个插件机制包含三个部分: 1.hook插件经理类:这个是核心文件,是一个应用程序全局Global对象.它主要有三个职责 1>监听已经注册了的所有插件,并实例化这

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

xadmin的插件机制

xadmin的视图方法中如果加了@filter_hook 标记的都可以作为插件的钩子函数. 例如在ListAdminView类中有许多加了上述标记的方法, @filter_hook def get_context(self): """ Prepare the context for templates. """ self.title = _('%s List') % force_unicode(self.opts.verbose_name) mo

舌尖上的安卓(android触控事件机制学习笔记录)

对于一个"我们从来不生产代码,我们只是大自然代码的搬运工"的码农来说.对android的触控机制一直是模棱两可的状态,特别是当要求一些自定义的控件和androide的自带控件(比如ViewPager,ListView,ScrollView)高度嵌套在一起使用时. 花了点时间梳理了下,做个笔记.对于一个触控的事件从用户输入到传递到Actigvity到最外层的Viewgroup在到子View,中间过程还可能穿插多个Viewgroup,android在ViewGroup提供了3个方法来控制流