c# winform插件
插件接口
namespace IMsg
{
///<summary>
/// 这是插件必须实现的接口,也是主程序与插件通信的唯一接口
/// 换句话说,主程序只认识插件里的这些方法
///</summary>
public interface IMsgPlug
{
/// <summary>
/// 显示窗体
/// </summary>
void OnShowDlg(); /// <summary>
/// 显示信息
/// </summary>
/// <returns></returns>
string OnShowInfo();
}
}
插件1
using IMsg;
using System; namespace MYPlugin1
{
public class myConsole : IMsgPlug
{
#region IMsgPlug 成员
public void OnShowDlg()
{
Console.WriteLine("控制台调用插件的OnShowDlg方法");
}
public string OnShowInfo()
{
return "myConsole";
}
#endregion
}
}
插件2
using IMsg;
using System.Windows.Forms; namespace MYPlugin1
{
public class MYDlg : Form, IMsgPlug
{
#region IMsgPlug 成员 public void OnShowDlg()
{
this.Text = "插件子窗体";
this.ShowDialog();//调用Form的ShowDialog,显示窗体
}
public string OnShowInfo()
{
return "MyDlg";
}
#endregion
}
}
winform调用插件
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Windows.Forms; namespace MsgBoxMain
{
public partial class FormMain : Form
{
///<summary>
/// 存放插件的集合
///</summary>
private ArrayList plugins = new ArrayList();
public FormMain()
{
InitializeComponent();
} ///<summary>
/// 载入所有插件
///</summary>
private void LoadAllPlugs()
{
//获取插件目录(plugins)下所有文件夹
DirectoryInfo dirs = new DirectoryInfo(Application.StartupPath + @"\Plugins"); foreach (DirectoryInfo dir in dirs.GetDirectories())
{
//获取文件夹下文件
string[] files = Directory.GetFiles(dir.FullName);
foreach (string file in files)
{
if (file.ToUpper().EndsWith(".DLL"))
{
try
{
//载入dll
Assembly ab = Assembly.LoadFrom(file);
Type[] types = ab.GetTypes();
foreach (Type t in types)
{
//如果某些类实现了预定义的IMsg.IMsgPlug接口,则认为该类适配与主程序(是主程序的插件)
if (t.GetInterface("IMsgPlug") != null)
{
plugins.Add(ab.CreateInstance(t.FullName));
listBox1.Items.Add(t.FullName);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
} private void btnLoadPlug_Click(object sender, EventArgs e)
{
LoadAllPlugs();
} //调用插件的方法
private void btnExecute_Click(object sender, EventArgs e)
{
if (this.listBox1.SelectedIndex == -) return;
object selObj = this.plugins[this.listBox1.SelectedIndex];
Type t = selObj.GetType();
MethodInfo OnShowDlg = t.GetMethod("OnShowDlg");
MethodInfo OnShowInfo = t.GetMethod("OnShowInfo"); OnShowDlg.Invoke(selObj, null);
object returnValue = OnShowInfo.Invoke(selObj, null);
this.lblMsg.Text = returnValue.ToString(); }
}
}
界面
c# winform插件的更多相关文章
- winform插件机制学习
这两天在看自定义控件,原来有太多知识没有掌握.今天看到插件机制,心里突然一亮,这个东西听了不少次,就是不知道是啥回事.这次有幸书里包含一个案例,我就跟着它一步步来.终于知道是什么回事了.这个应该在软件 ...
- [热拔插] 轻量级Winform插件式框架
写在前面的话 对于大神,Winform这种“古董玩具”,实在没太多“技术性”可言了,然而『好用才是王道』,本文不以技术为卖点,纯属经验之谈,欢迎交流拍砖 朴素版UI 开发初衷 由于本人所在公司不定时需 ...
- [MEF插件式开发] 一个简单的例子
偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...
- YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计
目前权限管理系统不少,但通用.灵活.符合现代企事业单位实际工作需要的不多.现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合 ...
- YbSoftwareFactory 代码生成插件【十四】:通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页
YbSoftwareFactory 的 YbRapidSolution for WinForm 插件使用CSLA.NET作为业务层,CSLA.NET的一个强大的特性是支持 N-Tiers 部署.只需非 ...
- [转][MEF插件式开发] 一个简单的例子
偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...
- C#构建可扩展的应用程序(插件)
构建可扩展的应用程序,特别是对于WinForm应用程序是特别有好处的.我们知道,企业的需求是瞬息万变的,企业在使用软件的过程中,很可能对于现有的需求有变动甚至是提出新的需求来,可是我们的软件已经部署在 ...
- 一个简化的插件框架c#
利用MEF实现插件加载. 定义了一套接口,分别实现插件主界面,插件,业务插件等. 整套加载完全使用MEF2. 所有插件分开,包括主界面也是插件实现. 用一个应用程序,只有Main和插件加载方法.我管它 ...
- Wpf 中使用gif格式的动态图
第一种方法:使用winform插件 <WindowsFormsHost xmlns:wf="clr-namespace:System.Windows.Forms;assembly=S ...
随机推荐
- Hibernate---detached entity passed to persist一个解决方法
1.查看id生成策略,2.查看是否是手动设置的id :3.查看实体对象映射配置是否正确. 例如: public Emplopes(String name, char gender) { super(n ...
- PLSQL怎样导出oracle表结构和数据
1.导出表结构和数据方式1.tools->export user objects是导出表结构 tools ->export user object 选择选项,导出.sql文件 说明:导出的 ...
- linux信任公钥的配置
一.每个用户都有自己的家目录 访问方式是:~/.ssh/id_rsa.pub 使用~就是表示家目录. 具体家目录在哪里,在用户密码配置文件中:/etc/passwd中.第6列的值就是. 可以使用~访问 ...
- 如何解决CRUD操作中与业务无关的字段赋值
提高效率一直是个永恒的话题,编程中有一项也是可以提到效率的,那就是专注做一件事情,让其它没有强紧密联系的与之分开.这里分享下我们做CRUD时遇到的常见数据处理场景: 数据库表字段全部设计为非空,即使这 ...
- [AngularJS] 使用AngularCSS动态加载CSS
[AngularJS] 使用AngularCSS动态加载CSS 前言 使用AngularAMD动态加载Controller 使用AngularAMD动态加载Service 上列两篇文章里,介绍了如何如 ...
- 决战大数据之三-Apache ZooKeeper Standalone及复制模式安装及测试
决战大数据之三-Apache ZooKeeper Standalone及复制模式安装及测试 [TOC] Apache ZooKeeper 单机模式安装 创建hadoop用户&赋予sudo权限, ...
- 闭包和this
一.闭包 最开始理解闭包是在一个函数内部定义一个函数,可以在外面的环境里进行调用.现在对于闭包的理解是利用函数来保存作用域内的对象. 理解闭包首先要理解执行上下文,变量对象,活动对象,作用域链.因为执 ...
- 【追寻javascript高手之路05】理解事件流
前言 新的一天又开始了,我们对今天对未来抱有很大期待,所以开始我们今天的学习吧,在此之前来点题外话,还是爱好问题. 周三的面试虽然失败,但是也是很有启迪的,比如之前我就从来没有想过爱好问题,我发现我的 ...
- AngularJS结合RequireJS做文件合并压缩的那些坑
我在项目使用了AngularJS框架,用RequireJS做异步模块加载(AMD),在做文件合并压缩时,遇到了一些坑,有些只是解决了,但不明白原因. 那些坑 1. build.js里面的paths必须 ...
- SharePoint 2013 VSS 编写器
Windows Server 包含的 VSS 是提供内置卷影复制功能的基础结构.VSS 创建的卷影副本扩展了存储管理员的磁带备份存档解决方案,提供可轻松.有效创建和还原的高保真时间点副本,从而帮助简化 ...