做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#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整DemoC#插件式框架开发完整Demo
这是一个基于c#的插件式开发源码,供大家参考
一个C# 插件式开发完整演示Demo(绝对原创,含源代码),结构清晰明了,一看就会,不可多得。
c#插件开发Demo, 大家可以了解下插件式开发
提起插件式,我们首先想到的是firefox, 用过firefox的人都知道它是一个插件式程序。当一个功能需要,完全可以从网上下载一个插件后,重启后,就能使用。这个功能给我们带来许多的方便之处,这就是插件式程序的好处。...
SMSS2008插件开发的DEMO项目。
C# RTSP 网络拉流 DEMO
基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏Demo源码(课程作业).zip基于c#开发的回合制游戏...
DotSpatial二次开发实例可运行,开源GIS,插件式二次开发实例对GIS二次开发有帮助。
C# 学习按键精灵研发_附带源码Demo实例 按键精灵是一款模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替双手,自动执行一系列鼠标键盘动作。按键精灵简单易用,不需要任何编程知识就可以作出功能强大的...
1、使用NModbus4.dll通讯插件开发的一个示例程序, 2、基于ModbusTCP通讯协议,电脑端可做为主站去读从站数据(如:PLC),同时电脑端也可以作为从站,让外部系统读取(如:MES、PLC等等)。 3、通过电脑端可以实现...
介绍利用C#对SolidWorks进行二次开发
一个在 .NET Framework 环境下实现的二维码生成与识别的小程序。 本人综合比较了已有的第三方库,最终选择了 ZXing.Net 。ZXing.Net 是开源项目 https://github.com/zxing/zxing 在 .NET 平台上的实现;虽然 NuGet ...
C# WINDOWS USB 开发DEMO 使用USB 通讯DEMO 仅供参考,细节还需更多的调试优化
使用C#2019开发的控制台插件式框架,系统由插件接口IPlugin、插件加载和执行类PluginLoader等组成。在使用时,需要按IPlugin接口创建插件主类,PluginLoader将按IPlugin检查指定目录的DLL文件并加载,然后调用其中的...
4.Flash.ocx 要附带在应用程序的根目录下,防止系统没有装Flash插件,自动注册 5.正常引用是不会报异常的,如果有异常,通常把 Interop.ShockwaveFlashObjects.dll, AxInterop.ShockwaveFlashObjects.dll, 放到...
是学习博客园Allen Lee同学的文章“探索 Word 2007 开发”系列前三章时候写下源代码,望对那些和我一样刚开始学习研究word二次开发的同学有所帮助,下载后请先阅读readme.txt文档。
C#开发的Socket通讯Demo 包含服务端和客户端源码,配置ip端口可直接用。
windows下的VS项目,压缩包里附带WPS2016专业版,解压后,可先阅读说明文档,然后进行操作,本代码提供了WPS插件实现的框架,只实现了简单的弹窗提示,其他功能只需在对应的接口内添加即可。
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)...