六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

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

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





主站蜘蛛池模板: 四虎黄色影院 | 日韩 在线视频精品 | 在线观看免费为成年视频 | 亚洲六月丁香色婷婷综合久久 | 青草国产在线 | 日本中文字幕在线看 | 日韩三级免费观看 | 五月婷婷精品 | 天天看天天射天天碰 | 中文字幕不卡在线高清 | 啪啪免费视频网站 | 天天曰曰 | 青青青在线网站视频在线 | 日本高清在线播放一区二区三区 | 天天躁夜夜躁狠狠躁2018a | 午夜精品福利影院 | 日本一区二区三区国产 | 色偷偷亚洲 | 日韩性黄色一级 | 三级中文有码中文字幕 | 日本一区二区三区在线看 | 亚洲精品在线免费观看视频 | 亚洲国产日韩在线观频 | 伊人色婷婷综在合线亚洲 | 日本免费高清一区 | 中文字幕在线色 | 亚洲成aⅴ人片在线观 | 四虎影院海外永久 | 偷窥自拍区 | 日韩在线观看免费完整版视频 | 四虎永久在线精品 | 日本xx高清视频免费观看 | 日本www色视频成人免费免费 | 日韩美女黄大片在线观看 | 亚洲欧美另类综合 | 四虎永久免费最新在线 | 特黄特黄视频 | 侵犯希崎中文字幕在线 | 青青青国产色视频在线观看 | 一级片久久 | 四虎在线永久免费视频网站 |