用 .NET 实现插件机制

小耳环0

小耳环0

2016-01-29 13:29

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

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

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

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

我们可以根据类型的名称,来动态载入一个所需要的类型。如:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com)

string typeName = "System.Configuration.NameValueSectionHandler, System";
Type t = Type.GetType(typeName);
Object obj = Activator.CreateInstance(t);

System.Configuration.NameValueSectionHandler obj = (System.Configuration.NameValueSectionHandler)Activator.CreateInstance(t);

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

通常的插件,是需要实现一定的接口的类。因此,在载入插件之前,需要确定该插件类型是否是合适的。
比如,一个插件的接口为 IPlugin,那么我们可以用如下方式来识别:

string interfaceName = typeof(IPlugin).FullName;
string typeName = "Muf.MyPlugin, MyPlugin";
Type t = Type.GetType(typeName);
             
if (  t == null
  || !t.IsClass
  || !t.IsPublic
  ||  t.GetInterface(interfaceName) == null)
{
 return null; // 不是所需要的插件
}

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

/// <summary
/// 动态装载并创建类型,该类型拥有指定接口
/// </summary
/// <param name="className"类型名称</param
/// <param name="interfaceName"指定的接口名称</param
/// <param name="param"指定构造函数的参数(null或空的数组表示调用默认构造函数)</param
/// <returns返回所创建的类型(null表示该类型无法创建或找不到)</returns
public static object LoadObject(string className, string interfaceName, object[] param)
{
 try
 {
  Type t = Type.GetType(className);
             
  if ( t == null
   || !t.IsClass
   ||  !t.IsPublic
   ||  t.IsAbstract
   ||  t.GetInterface(interfaceName) == null)
  {
   return null;
  }

  object o = Activator.CreateInstance(t, param);
  if( o == null )
  {
   return null;
  }
    
  return o;
 }
 catch( Exception ex )
 {
  return null;
 }
}

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

插件配置,一般有两种方法:
1. 将插件类型名称写在配置文件中,如app.config。配置文件的使用可以参考沐枫专栏的其它文章。
2. 指定一个目录为插件目录,然后在该目录中所有的程序集(如*.dll)全部加载,并用反射机制,获取所有的公共类型,并全部尝试用LoadObject加载,加载成功的就是合适的插件。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com)
展开更多 50%)
分享

猜你喜欢

用 .NET 实现插件机制

电脑网络
用 .NET 实现插件机制

.NET中的自绘机制

C语言教程 C语言函数
.NET中的自绘机制

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用VB.NET实现你的游戏梦想

vb
用VB.NET实现你的游戏梦想

用Java事件处理机制实现录制回放功能

编程语言 网络编程
用Java事件处理机制实现录制回放功能

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java反射机制的实现详解

编程语言 网络编程
Java反射机制的实现详解

Linux内核驱动fsync机制实现图解

服务器
Linux内核驱动fsync机制实现图解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用ASP.Net获取客户端网卡的MAC

用ASP.Net获取客户端网卡的MAC

使用PHP5创建图形的巧妙方法四

使用PHP5创建图形的巧妙方法四
下拉加载更多内容 ↓