亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

靈活正確的實現.NET插件機制

2019-11-18 19:12:54
字體:
來源:轉載
供稿:網友

  .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為程序集的具體版本、文化背景、簽名,沒有特定要求,這些都可以省略。
  我們可以根據類型的名稱,來動態載入一個所需要的類型。如:


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載入任何所需的插件。

  插件一般放在配置文件中,并由程序讀入:

  配置文件舉例(配置文件的使用參見我的相關隨筆):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="Channels" type="Vmp.Configuration.ChannelsSectionHandler, Communication" />
    </configSections>
   
    <Channels>
        <channel
            ChannelType="Vmp.Communication.TcpChannel, Communication"
            TraceFile="d:/log/channel1.log"
            Port="2020" MaxConnections="300" BufferSize="2048"
        />
    </Channels>
</configuration>
  代碼范例:

PRivate ArrayList channelsList = new ArrayList();

private LoadChannels()
{
    ArrayList channelsConfig = (ArrayList)ConfigurationSettings.GetConfig( "Channels" );
    foreach(Hashtable config in channelsConfig)
    {
        string channelType    = (string) config["ChannelType"];

        IChannel channel = (IChannel) CommonUtils.LoadObject(channelType, typeof(IChannel).FullName, new object[]{config});
        if(channel == null)
            continue;

        channelsList.Add(channel);
}

  也可以遍歷指定的插件目錄,并載入所有符合要求的插件,例如:

public IPlugin[] LoadAllPlugIn(string pluginDir)
{
    // 設置默認的插件目錄
    if(pluginDir == null || pluginDir == "")
        pluginDir = "./PlugIns";

    // 獲取插件接口名稱
    string interfaceName = typeof(IPlugin).FullName;

    // 用于存放插件的數組
    ArrayList arr = new ArrayList();

    // 遍歷插件目錄(假設插件為dll文件)
    foreach(string file in Directory.GetFiles(pluginDir, "*.dll"))
    {
        // 載入插件文件
        Assembly asm = Assembly.LoadFile(file);
        // 遍歷導出的插件類
        foreach(Type t in asm.GetExportedTypes())
        {
            // 載入插件,如果插件不符合指定的接口,則返回null
            IPlugin plugin = LoadObject(t.FullName, interfaceName, null) as IPlugin;

            if(plugin != null)
                arr.Add(plugin);
        }
    }

    // 返回插件
    return (IPlugin[])arr.ToArray(typeof(IPlugin));
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产精品人人做人人爱| 尤物yw午夜国产精品视频| 国产69精品久久久| 亚洲最大福利视频网| 日韩av综合中文字幕| 国产精品成人一区二区| 91色琪琪电影亚洲精品久久| 国产日韩在线看片| 亚洲午夜未满十八勿入免费观看全集| 国产精品一区二区久久久久| 国产日韩精品入口| 亚洲偷欧美偷国内偷| 欧美黄网免费在线观看| 91久久精品日日躁夜夜躁国产| 久久成人国产精品| 成人激情视频在线观看| 久久久久久高潮国产精品视| 亚洲aⅴ男人的天堂在线观看| 国产精品偷伦免费视频观看的| 久久精品99久久久久久久久| 亚洲激情久久久| 精品视频在线播放免| 亚洲国产美女久久久久| 色999日韩欧美国产| 国产精品久久久久久久电影| 日韩精品欧美激情| 亚洲无av在线中文字幕| 欧洲s码亚洲m码精品一区| 精品国偷自产在线视频99| 久久精品视频va| 不卡在线观看电视剧完整版| 不卡av在线网站| 日韩av在线直播| 91av网站在线播放| 亚洲激情小视频| 91成人福利在线| 久久久久久国产精品| 色综合91久久精品中文字幕| 热99精品里视频精品| 欧美精品999| 97视频免费在线看| 亚洲国产一区二区三区在线观看| 国产亚洲精品一区二555| 亚洲一区二区久久久久久久| 1769国内精品视频在线播放| 欧美激情精品久久久久久免费印度| 久久久久久久久久久久av| 国产欧美日韩中文字幕| 一区二区在线视频播放| 国产成人精品免高潮费视频| 欧美成人精品激情在线观看| 97在线观看视频| 久久久久久美女| 正在播放欧美一区| 亚洲成人网av| 岛国精品视频在线播放| 成人免费网站在线看| 欧美一区二区三区……| 国产精品一区二区3区| 色悠久久久久综合先锋影音下载| 国产69久久精品成人看| 亚洲精品一区二区久| 欧美亚洲日本网站| 在线日韩第一页| 性色av一区二区咪爱| 韩国三级电影久久久久久| 精品亚洲永久免费精品| 久久成年人免费电影| 欧美电影在线观看网站| 国产精品99久久久久久人| 成人av在线天堂| 亚洲欧洲美洲在线综合| 国产精品久久久久国产a级| 亚洲精品99久久久久中文字幕| 欧美国产亚洲精品久久久8v| 日产日韩在线亚洲欧美| 日韩在线免费视频| 国产精品九九九| 亚洲精品久久久久中文字幕欢迎你| 性色av一区二区三区| 亚洲人午夜精品| 97在线精品视频| 色偷偷888欧美精品久久久| 国产成人综合一区二区三区| 国产精品高潮呻吟久久av无限| 欧美情侣性视频| 久久手机免费视频| 少妇高潮 亚洲精品| 欧美大学生性色视频| 欧美国产日韩一区二区在线观看| 精品国模在线视频| 欧美日韩精品二区| 欧美日韩精品国产| 大伊人狠狠躁夜夜躁av一区| 国产亚洲精品激情久久| 欧美在线一级视频| 国产在线999| 中文字幕亚洲色图| 日韩福利在线播放| 亚洲va欧美va国产综合剧情| 久久伊人精品一区二区三区| 日韩有码视频在线| 日本成人在线视频网址| 精品精品国产国产自在线| 欧美性猛交xxxx乱大交极品| 日韩免费av片在线观看| 国产精品午夜一区二区欲梦| 精品在线小视频| 亚洲欧美综合图区| 久久久在线视频| 欧美极品少妇全裸体| 91精品啪在线观看麻豆免费| 国产经典一区二区| 精品久久国产精品| 久久久久久久久久久网站| 亚洲一区二区免费| 国产成人aa精品一区在线播放| 亚洲激情免费观看| 亚洲色图日韩av| 欧美自拍视频在线| 精品丝袜一区二区三区| 欧美在线播放视频| 日本91av在线播放| 91精品国产高清久久久久久| 欧美视频免费在线观看| 色天天综合狠狠色| 欧美高清视频免费观看| 丰满岳妇乱一区二区三区| 午夜精品一区二区三区在线| 欧美国产日本在线| 日韩在线www| 欧美日韩性视频在线| 中文字幕av一区二区三区谷原希美| 久久国内精品一国内精品| 成人免费高清完整版在线观看| 亚洲美女福利视频网站| 日韩欧美在线字幕| 欧美日韩亚洲一区二区| 欧美超级乱淫片喷水| 亚洲欧美中文字幕在线一区| 国产丝袜一区二区| 成人黄色生活片| 国产精品日韩欧美综合| www国产精品com| 一本色道久久综合亚洲精品小说| 日韩av电影手机在线| 少妇高潮 亚洲精品| 在线日韩欧美视频| 色琪琪综合男人的天堂aⅴ视频| 亚洲欧洲在线视频| 日韩视频欧美视频| 日韩国产精品视频| 777国产偷窥盗摄精品视频| 久久精品国产亚洲| xvideos国产精品| 久久国产精品久久久久久| 91香蕉嫩草影院入口| 国产精品美女久久久久av超清| 久久久久久com| 亚洲欧美制服中文字幕| 亚洲尤物视频网| 国语自产精品视频在线看一大j8| 欧美激情影音先锋| 中文字幕亚洲专区|