国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

用 .NET 實(shí)現(xiàn)插件機(jī)制

2024-07-10 12:58:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • 本文來(lái)源于網(wǎng)頁(yè)設(shè)計(jì)愛(ài)好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問(wèn)。
  •   .net 提供的反射(reflection)機(jī)制可以很方便的加載插件。本文提供一種方法,可以靈活的正確的載入所需的插件。

    在.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加載,加載成功的就是合適的插件。


    發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 社旗县| 桃源县| 新龙县| 甘洛县| 阳原县| 安徽省| 榆中县| 遂昌县| 精河县| 吴川市| 安平县| 石泉县| 新丰县| 桑植县| 鹤山市| 通州市| 溆浦县| 云和县| 密山市| 繁峙县| 台安县| 庆阳市| 昭通市| 临泉县| 黄梅县| 探索| 静宁县| 莲花县| 泸水县| 慈溪市| 黎川县| 吉安县| 博爱县| 蓬安县| 新宾| 巴东县| 即墨市| 德钦县| 融水| 江阴市| 吉水县|