在.net中,一個(gè)完整的類型名稱的格式如 "類型名, 程序集名"。
例如:"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,系統(tǒng)為自動(dòng)為其適配擴(kuò)展名(如system.dll或system.exe);
version、culture、publickeytoken為程序集的具體版本、文化背景、簽名,沒(méi)有特定要求,這些都可以省略。
我們可以根據(jù)類型的名稱,來(lái)動(dòng)態(tài)載入一個(gè)所需要的類型。如:
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);
此時(shí),obj 就是所需要的類型實(shí)例。
通常的插件,是需要實(shí)現(xiàn)一定的接口的類。因此,在載入插件之前,需要確定該插件類型是否是合適的。
比如,一個(gè)插件的接口為 iplugin,那么我們可以用如下方式來(lái)識(shí)別:
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; // 不是所需要的插件
}
總結(jié)上述代碼,我們可以做出通用的加載插件的代碼:
/// <summary>
/// 動(dòng)態(tài)裝載并創(chuàng)建類型,該類型擁有指定接口
/// </summary>
/// <param name="classname">類型名稱</param>
/// <param name="interfacename">指定的接口名稱</param>
/// <param name="param">指定構(gòu)造函數(shù)的參數(shù)(null或空的數(shù)組表示調(diào)用默認(rèn)構(gòu)造函數(shù))</param>
/// <returns>返回所創(chuàng)建的類型(null表示該類型無(wú)法創(chuàng)建或找不到)</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. 指定一個(gè)目錄為插件目錄,然后在該目錄中所有的程序集(如*.dll)全部加載,并用反射機(jī)制,獲取所有的公共類型,并全部嘗試用loadobject加載,加載成功的就是合適的插件。
新聞熱點(diǎn)
疑難解答
圖片精選