欢迎来到天天文库
浏览记录
ID:10628659
大小:53.50 KB
页数:3页
时间:2018-07-07
《用 .net 实现插件机制--》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、用.NET实现插件机制>>.提供的反射(Reflection)机制可以很方便的加载插件。本文提供一种方法,可以灵活的正确的载入所需的插件。在.中,一个完整的类型名称的格式如"类型名,程序集名"。例如:"System.Configuration.NameValueSectionHandler,System,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"。类型名为:System.Configuration.NameValueSectionHandler,这是带名字空间的完整类型名。你也可
2、以使用该类型的FullName得到。如:stringtypeName=typeof(NameValueSectionHandler).FullName;程序集名为:"System,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089",程序集名为System,系统为自动为其适配扩展名(如System.dll或System.exe);Version、Culture、PublicKeyToken为程序集的具体版本、文化背景、签名,没有特定要求,这些都可以省略。我们可以根据类型的名称,来动态载入一
3、个所需要的类型。如:stringtypeName="System.Configuration.NameValueSectionHandler,System";Typet=Type.GetType(typeName);Objectobj=Activator.CreateInstance(t);或System.Configuration.NameValueSectionHandlerobj=(System.Configuration.NameValueSectionHandler)Activator.CreateInstance(t);此时,obj就是所需要的类型实例。通常
4、的插件,是需要实现一定的接口的类。因此,在载入插件之前,需要确定该插件类型是否是合适的。比如,一个插件的接口为IPlugin,那么我们可以用如下方式来识别:stringinterfaceName=typeof(IPlugin).FullName;stringtypeName="Muf.MyPlugin,MyPlugin";Typet=Type.GetType(typeName);if(t==null
5、
6、!t.IsClass
7、
8、!t.IsPublic
9、
10、t.GetInterface(interfaceName)==null){returnnull;//不是所需要的插件}总
11、结上述代码,我们可以做出通用的加载插件的代码:///<summary>///动态装载并创建类型,该类型拥有指定接口///</summary>///<paramname="className">类型名称</param>///<paramname="interfaceName">指定的接口名称</param>///<paramname="param">指定构造函数的参数(null或空的数组表示调用默认构造函数)</param>///<returns>返回所创建的类型(
12、null表示该类型无法创建或找不到)</returns>publicstaticobjectLoadObject(stringclassName,stringinterfaceName,object[]param){try{Typet=Type.GetType(className);if(t==null
13、
14、!t.IsClass
15、
16、!t.IsPublic
17、
18、t.IsAbstract
19、
20、t.GetInterface(interfaceName)==null){returnnull;}objecto=Activator.CreateInstance(t,param
21、);if(o==null){returnnull;}returno;}catch(Exceptionex){returnnull;}}以后,我们就可以使用LoadObject载入任何所需的插件。插件配置,一般有两种方法:1.将插件类型名称写在配置文件中,如app.config。配置文件的使用可以参考沐枫专栏的其它文章。12下一页>>>>这篇文章来自..,。2.指定一个目录为插件目录,然后在该目录中所有的程序集(如*.dll)全部加载,并用反射机制,获取所有的公共类型,并全部尝试用LoadObject加载,加载成功的就是合适的插件。上一页1
此文档下载收益归作者所有