<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用 .NET 完成插件機制

      [摘要]在.NET中,一個完整的類型名稱的格式如 "類型名, 程序集名"。例如:"System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, Public...
       

      在.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為程序集的具體版本、文化背景、簽名,沒有特定要求,這些都可以省略。

      我們可以根據類型的名稱,來動態載入一個所需要的類型。如:

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





      日韩精品一区二区三区高清