`

C#实现插件式开发的一个Demo分享

 
阅读更多


winform程序,很多时候都需要用到插件式的,所以本人做了一个Demo,思路跟网上思路基本一致,现在共享出来如有需要的朋友可以下载。

原理很简单:

一:定义插件接口

二:实现插件接口并建立不同工项目,使其在生成时生成不同的DLL

三:主程序运行时根据接口名利用反射对插件目录的DLL进行加载,加载完成后便可以使用插件接口定义的方法或属性了。

下面上几张图,有兴趣的朋友可以先看看,觉得值得一看的朋友可以下载。

项目结构:

DefaultPlugin,PosPlugin两个项目均为插件,均实现了Iplugin接可

Iplugin接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace WinDemo.Core
{
public interface Iplugin
{

PluginInfoAttributePluginInfo
{
get ; set ;}
bool IsLoad
{
get ;
set ;
}

ImageModulePicture
{
get ;
}

ImageModulePictureEnter
{
get ;
}

ImageModulePictureClick
{
get ;
}

string ModuleName
{
get ;
}


Dictionary
< string ,EventHandler > ChildNodes
{
get ;
}

ILoadFormFormLoader
{
get ;
set ;
}


}
}

用于加载插件的类 PluginLoader
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;
using System.Windows.Forms;
using System.Collections;

namespace WinDemo.Core
{
public static class PluginLoader
{

public static List < Iplugin > plugins = new List < Iplugin > ();
private static ArrayListpiProperties = new ArrayList();

private static bool IsValidPlugin(Typet)
{
bool ret = false ;
Type[]interfaces
= t.GetInterfaces();
foreach (TypetheInterface in interfaces){
if (theInterface.FullName == " WinDemo.Core.Iplugin " )
{
ret
= true ;
break ;
}
}
return ret;
}




public static void LoadAllPlugins()
{
string []files = Directory.GetFiles(Application.StartupPath + " //plugin// " );
int i = 0 ;
PluginInfoAttributetypeAttribute
= new PluginInfoAttribute();
foreach ( string file in files)
{
string ext = file.Substring(file.LastIndexOf( " . " ));
if (ext != " .dll " ) continue ;
try
{
Assemblytmp
= Assembly.LoadFile(file);
Type[]types
= tmp.GetTypes();
bool ok = false ;
foreach (Typet in types)
if (IsValidPlugin(t))
{
Ipluginplugin
= (Iplugin)tmp.CreateInstance(t.FullName);
plugins.Add(plugin);
object []attbs = t.GetCustomAttributes(typeAttribute.GetType(), false );
PluginInfoAttributeattribute
= null ;
foreach ( object attb in attbs)
{
if (attb is PluginInfoAttribute)
{
attribute
= (PluginInfoAttribute)attb;
attribute.Index
= i;
i
++ ;
ok
= true ;
break ;
}
}

if (attribute != null )
{
piProperties.Add(attribute);
plugin.PluginInfo
= attribute;
}
else throw new Exception( " 为定义插件属性 " );
if (ok) break ;
}
}
catch (Exceptionerr)
{
throw err;
}
}
plugins.Sort((p1,p2)
=> {
return p2.PluginInfo.Index - p1.PluginInfo.Index;
});
}
}
}

Iplugin的实现类PosPlugin类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using WinDemo.Core;
using System.Windows.Forms;


namespace DefaultPlugin
{
[PluginInfo(
" Default " , " 1.0 " , " XH " , " www.cnporter.com " , true , 2 )]
public class Default:WinDemo.Core.Iplugin
{
private Dictionary < string ,EventHandler > _ChildNodes = new Dictionary < string ,EventHandler > ();
private LeftNavfrmLeftNav = new LeftNav();
public static ILoadFormFormloader;
public Default()
{

_ChildNodes.Add(
" 菜单五 " ,(sender,e) =>
{
MessageBox.Show(sender.ToString());
});
_ChildNodes.Add(
" 菜单四 " ,(sender,e) =>
{
MessageBox.Show(sender.ToString());
});
_ChildNodes.Add(
" 菜单三 " ,(sender,e) =>
{
MessageBox.Show(sender.ToString());
});
_ChildNodes.Add(
" 菜单二 " ,(sender,e) =>
{
MessageBox.Show(sender.ToString());
});
_ChildNodes.Add(
" 菜单一 " ,(sender,e) =>
{
FormLoader.LoadNavFrm(frmLeftNav);
});
}



public ImageModulePicture
{
get
{
return ((System.Drawing.Image)(ImageResource.Index));
}
}

public ImageModulePictureEnter
{
get
{
return ((System.Drawing.Image)(ImageResource.IndexEnter));
}
}

public ImageModulePictureClick
{
get
{
return ((System.Drawing.Image)(ImageResource.IndexClick));
}
}

public string ModuleName
{
get
{
return " 首页 " ;
}
}

public Dictionary < string ,EventHandler > ChildNodes
{
get
{
return _ChildNodes;
}
}




public bool IsLoad
{
get ;
set ;
}

public ILoadFormFormLoader
{
get
{
return Formloader;
}
set
{
Formloader
= value;
}
}



public PluginInfoAttributePluginInfo
{
get ;
set ;
}
}


}

此图现在有两个插件

运行效果如下

源码下载

分享到:
评论

相关推荐

    C#插件式框架开发完整Demo

    C#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整Demo

    c#插件式开发demo

    这是一个基于c#的插件式开发源码,供大家参考

    C# 插件式开发完整演示Demo(绝对原创)

    一个C# 插件式开发完整演示Demo(绝对原创,含源代码),结构清晰明了,一看就会,不可多得。

    c#插件开发Demo

    c#插件开发Demo, 大家可以了解下插件式开发

    C# 插件程序demo

    提起插件式,我们首先想到的是firefox, 用过firefox的人都知道它是一个插件式程序。当一个功能需要,完全可以从网上下载一个插件后,重启后,就能使用。这个功能给我们带来许多的方便之处,这就是插件式程序的好处。...

    SSMS2008插件开发DEMO1

    SMSS2008插件开发的DEMO项目。

    C# RTSP 网络拉流 DEMO

    C# RTSP 网络拉流 DEMO

    基于c#开发的回合制游戏Demo源码(课程作业).zip

    基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏...

    DotSpatial二次开发实例(开源、MEF插件式开发)

    DotSpatial二次开发实例可运行,开源GIS,插件式二次开发实例对GIS二次开发有帮助。

    C# 学习按键精灵研发_附带源码Demo实例

    C# 学习按键精灵研发_附带源码Demo实例 按键精灵是一款模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替双手,自动执行一系列鼠标键盘动作。按键精灵简单易用,不需要任何编程知识就可以作出功能强大的...

    VS2017,C#,WinForm,ModbusTCP(Slave从站、Master主站)DEMO示例程序

    1、使用NModbus4.dll通讯插件开发的一个示例程序, 2、基于ModbusTCP通讯协议,电脑端可做为主站去读从站数据(如:PLC),同时电脑端也可以作为从站,让外部系统读取(如:MES、PLC等等)。 3、通过电脑端可以实现...

    基于C#的SolidWorks二次开发.rar_C# solidworks_solidworks c#_solidwork

    介绍利用C#对SolidWorks进行二次开发

    C# 利用 ZXing.Net 实现二维码生成与识别(WPF 做的一个 Demo)

    一个在 .NET Framework 环境下实现的二维码生成与识别的小程序。 本人综合比较了已有的第三方库,最终选择了 ZXing.Net 。ZXing.Net 是开源项目 https://github.com/zxing/zxing 在 .NET 平台上的实现;虽然 NuGet ...

    C# WINDOWS USB 开发DEMO

    C# WINDOWS USB 开发DEMO 使用USB 通讯DEMO 仅供参考,细节还需更多的调试优化

    C#-控制台插件框架

    使用C#2019开发的控制台插件式框架,系统由插件接口IPlugin、插件加载和执行类PluginLoader等组成。在使用时,需要按IPlugin接口创建插件主类,PluginLoader将按IPlugin检查指定目录的DLL文件并加载,然后调用其中的...

    Flash 控件Demo

    4.Flash.ocx 要附带在应用程序的根目录下,防止系统没有装Flash插件,自动注册 5.正常引用是不会报异常的,如果有异常,通常把 Interop.ShockwaveFlashObjects.dll, AxInterop.ShockwaveFlashObjects.dll, 放到...

    word2007 addin 二次开发 C# Demo以及参考文档

    是学习博客园Allen Lee同学的文章“探索 Word 2007 开发”系列前三章时候写下源代码,望对那些和我一样刚开始学习研究word二次开发的同学有所帮助,下载后请先阅读readme.txt文档。

    C#开发的Socket通讯Demo

    C#开发的Socket通讯Demo 包含服务端和客户端源码,配置ip端口可直接用。

    WPS插件开发demo_windows

    windows下的VS项目,压缩包里附带WPS2016专业版,解压后,可先阅读说明文档,然后进行操作,本代码提供了WPS插件实现的框架,只实现了简单的弹窗提示,其他功能只需在对应的接口内添加即可。

    Grid++Report 6.6.7.0 Demo模板例子 免费报表开发工具

    Grid++Report是一款同时支持C/S软件(桌面程序)与B/S软件(WEB程序)开发的报表工具,功能全面易学易用。C/S开发适用于VB.NET、C#、VB6、VB、VC、Delphi、C++Builder、QT与易语言等。B/S开发适用于ASP.NET(C# & VB.NET)...

Global site tag (gtag.js) - Google Analytics