.NET提供的反射(Reflection)机制可以很方便的加载插件。本文提供一种方法,可以灵活的正确的载入所需的插件。

在.NET中,一个完整的类型名称的格式如"类型名,程序集名"。

例如:"System.Configuration.NameValueSectionHandler,System,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"。

类型名为:System.Configuration.NameValueSectionHandler,这是带名字空间的完整类型名。
你也可以使用该类型的FullName得到。
如:stringtypeName=typeof(NameValueSectionHandler).FullName;
程序集名为:"System,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089",
程序集名为System,系统为自动为其适配扩展名(如System.dll或System.exe);
Version、Culture、PublicKeyToken为程序集的具体版本、文化背景、签名,没有特定要求,这些都可以省略。
我们可以根据类型的名称,来动态载入一个所需要的类型。如:

stringtypeName="System.Configuration.NameValueSectionHandler,System";
Typet=Type.GetType(typeName);
Objectobj=Activator.CreateInstance(t);
//或
System.Configuration.NameValueSectionHandlerobj=(System.Configuration.NameValueSectionHandler)Activator.CreateInstance(t);

此时,obj就是所需要的类型实例。

通常的插件,是需要实现一定的接口的类。因此,在载入插件之前,需要确定该插件类型是否是合适的。

比如,一个插件的接口为IPlugin,那么我们可以用如下方式来识别:

stringinterfaceName=typeof(IPlugin).FullName;
stringtypeName="Muf.MyPlugin,MyPlugin";
Typet=Type.GetType(typeName);

if(t==null
||!t.IsClass
||!t.IsPublic
||t.GetInterface(interfaceName)==null)
{
returnnull;//不是所需要的插件
}

总结上述代码,我们可以做出通用的加载插件的代码:

/**<summary>
///动态装载并创建类型,该类型拥有指定接口
///</summary>
///<paramname="className">类型名称</param>
///<paramname="interfaceName">指定的接口名称</param>
///<paramname="param">指定构造函数的参数(null或空的数组表示调用默认构造函数)</param>
///<returns>返回所创建的类型(null表示该类型无法创建或找不到)</returns>
publicstaticobjectLoadObject(stringclassName,stringinterfaceName,object[]param)
{
try
{
Typet=Type.GetType(className);

if(t==null
||!t.IsClass
||!t.IsPublic
||t.IsAbstract
||t.GetInterface(interfaceName)==null)
{
returnnull;
}

objecto=Activator.CreateInstance(t,param);
if(o==null)
{
returnnull;
}

returno;
}
catch(Exceptionex)
{
returnnull;
}
}

以后,我们就可以使用LoadObject载入任何所需的插件。

插件一般放在配置文件中,并由程序读入:

配置文件举例(配置文件的使用参见我的相关随笔):

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<configSections>
<sectionname="Channels"type="Vmp.Configuration.ChannelsSectionHandler,Communication"/>
</configSections>

<Channels>
<channel
ChannelType="Vmp.Communication.TcpChannel,Communication"
TraceFile="d:\log\channel1.log"
Port="2020"MaxConnections="300"BufferSize="2048"
/>
</Channels>
</configuration>
代码范例:

privateArrayListchannelsList=newArrayList();

privateLoadChannels()
{
ArrayListchannelsConfig=(ArrayList)ConfigurationSettings.GetConfig("Channels");
foreach(HashtableconfiginchannelsConfig)
{
stringchannelType=(string)config["ChannelType"];

IChannelchannel=(IChannel)CommonUtils.LoadObject(channelType,typeof(IChannel).FullName,newobject[]{config});
if(channel==null)
continue;

channelsList.Add(channel);
}

也可以遍历指定的插件目录,并载入所有符合要求的插件,例如:

publicIPlugin[]LoadAllPlugIn(stringpluginDir)
{
//设置默认的插件目录
if(pluginDir==null||pluginDir=="")
pluginDir="./PlugIns";

//获取插件接口名称
stringinterfaceName=typeof(IPlugin).FullName;

//用于存放插件的数组
ArrayListarr=newArrayList();

//遍历插件目录(假设插件为dll文件)
foreach(stringfileinDirectory.GetFiles(pluginDir,"*.dll"))
{
//载入插件文件
Assemblyasm=Assembly.LoadFile(file);
//遍历导出的插件类
foreach(Typetinasm.GetExportedTypes())
{
//载入插件,如果插件不符合指定的接口,则返回null
IPluginplugin=LoadObject(t.FullName,interfaceName,null)asIPlugin;

if(plugin!=null)
arr.Add(plugin);
}
}

//返回插件
return(IPlugin[])arr.ToArray(typeof(IPlugin));
}

转载于:https://www.cnblogs.com/netweb/archive/2008/10/27/1320540.html

灵活正确的实现.NET插件机制相关推荐

  1. mixin机制 vue_读?VuePress(四)插件机制

    前言 从 9 月份开始,vuepress 源码进行了重新设计和拆分.先是开了个 next 分支,后来又合并到 master 分支,为即将发布的 1.x 版本做准备. 最主要的变化是:大部分的全局功能都 ...

  2. 【问链-EOS公开课】第十三课 EOS插件机制深入解析

    插件体系 EOS插件由三层类来实现. 最顶层是抽象类abstract_plugin,定义了插件的基本接口. 中间层是插件模板类plugin,主要用来解决插件之间依赖调用. 最底层是具体插件类,专注单个 ...

  3. 解析 WordPress 插件机制

    一直对软件的组件.插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充 系统的功能.Eclipse就是一个非常棒的例子,几乎你想什么 ...

  4. 行为扩展以及插件机制

    在thinkPHP中的行为扩展和插件机制. 首先行为扩展这个概念是TP框架的核心组成之一,关于行为的解释我就粗略的概括一下吧: TP在从接受到HTTP请求到最终将试图输出,期间经历的很多步骤,这些步骤 ...

  5. for循环执行 mybatis_MyBatis 插件机制详解

    MyBatis 是现在比较流行的 ORM 框架,得益于它简单易用,虽然增加了开发者的一些操作,但是带来了设计和使用上的灵活,得到广泛的使用.之前的一篇文章MyBatis 初始化之XML解析详解中我们已 ...

  6. C++ 插件机制的实现原理、过程、及使用

    什么是插件机制 插件是你想开发一个好的系统所需要的一种好的架构方式.C++插件是 C++ 编写的动态链接共享对象.一种可复用的.灵活管理(维护.替换或增加.删除)的功能模块儿化组件.基于插件的扩展性, ...

  7. c++插件化 NDD源码的插件机制实现解析

    插件机制是一种框架,允许开发人员简单地在应用程序中添加或扩展功能.它使广泛使用,因为它可以作为模块被重复使用,并使它们更易于维护和扩展,因此它们在应用程序中非常有用.插件机制允许管理员在需要时轻松安装 ...

  8. 初探maven插件机制

    初探maven插件机制 第一部分 Plexus 本质上说,Maven是一个plugin的框架,所以需要有一个管理者来管理这些plugin.Maven选择了Plexus作为plugin的管理者.作为初探 ...

  9. webpack插件机制

    webpack插件机制是整个webpack工具的核心,那么webpack插件有什么特点呢? 1.独立的JS模块,暴露相应的函数 2.函数原型上的apply方法会注入compiler对象(之所以要定义a ...

最新文章

  1. 超准中医体质测试 源码_心理测试:这几张心理测试图,一眼看透你的内心!不信你来试试!...
  2. 一个网络公司的任职要求
  3. 上周热点回顾(9.7-9.13)
  4. 安卓通过绑定开启服务 来调用服务里的方法
  5. 请确定指定的驱动器中是否有盘_百格拉伺服驱动器维修常见故障现象及处理方法...
  6. 一致性协议raft详解(二):安全性
  7. java最大内存_JAVA:测试java虚拟机支持的最大内存 Xmx 值?Tomcat 内存溢出?
  8. tomcat8 安装|解决启动慢|进入管理|host-manager 403错误
  9. ubuntu 重定向
  10. Linux基础操作及命令管理
  11. kernel.sem信号量参数调优,以及ipcs信号量队列查询
  12. Linux磁盘分区及文件系统格式化和挂载
  13. php做个抽签人名,怎样在excel制作一个用于抽签函数,别的工具也行(excel随机抽取人名不重复)...
  14. Django ORM模型一对一、一对多、多对多的操作详解
  15. 阿里云网盘资源免费分享论坛正式上线
  16. 使用 Learner Lab 建立 WordPress 网站 (EC2)
  17. thinkphp3.2读取Excel文件
  18. ECCV 2022|计算机视觉中的长尾分布问题还值得做吗?
  19. cad选择集的问题(VBA )
  20. 计算机网络的应用特点是什么,现代计算机通信技术特点及通信网络的应用

热门文章

  1. linux系统的文件系统tmpfs,linux里tmpfs文件系统
  2. asteroids模板 游戏 java_在高级Java游戏中存储全局/静态变量的最佳方法是什么?...
  3. 审计文件服务器的5个核心要素
  4. CVE-2020-1472 | Netlogon 特权提升漏洞预警
  5. VMware vCenter Server Appliance Photon OS安全修补程序
  6. Maven学习总结(33)——开发人员如何使用 Flyway 插件管理数据库版本
  7. Spring Boot学习总结(17)——Spring Boot常见面试题再总结
  8. 红帽高级总监谈 OpenJDK 的未来:Java 的未来从未如此光明
  9. 气缸标识上vr什么意思_汽车VR传感器是什么意思?
  10. python大气校正_Python 处理遥感图像:光谱辐射定标、大气校正和计算反射率