最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用反射加載多個程序集的實現(xiàn)方法

 更新時間:2016年06月10日 12:04:18   投稿:jingxian  
下面小編就為大家?guī)硪黄狢#使用反射加載多個程序集的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

當開發(fā)插件的時候需要用到反射,在客戶端動態(tài)加載遍歷程序集,并調(diào)用每個程序集的方法。

創(chuàng)建一個控制臺應用程序,首先設計一個接口:

public interface ISay 
 { 
   void SaySth(); 
 } 

在控制臺應用程序下創(chuàng)建Plugins文件夾,控制臺的可執(zhí)行文件和所有程序集文件都生成在這里。右鍵控制臺項目--"屬性"--"生成",把"輸出路徑"設置成Plugins文件夾。

創(chuàng)建類庫項目Assembly1,添加對控制臺項目的引用,并創(chuàng)建實現(xiàn)ISay接口的類:

namespace Assembly1 
{ 
  public class OneSay : ISay 
  { 
    public void SaySth() 
    { 
      Console.WriteLine("我來自程序集1"); 
    } 
  } 
} 

右鍵類庫項目Assembly1--"屬性"--"生成",把"輸出路徑"設置成Plugins文件夾,并生成類庫項目Assembly1。

客戶端需要找到所有程序集中所有實現(xiàn)ISay接口的類。其基本思路是:

→找到Plugins文件夾下所有dll后綴的文件

→遍歷這些文件,根據(jù)文件名動態(tài)加載程序集

→遍歷程序集中實現(xiàn)ISay接口的類型,并保存到ISay類型的集合中

→客戶端遍歷ISay類型的集合,調(diào)用ISay的接口方法

class Program 
  { 
    static void Main(string[] args) 
    { 
      foreach (var say in GetSpeakers()) 
      { 
        say.SaySth(); 
      } 
    } 
    static List<ISay> GetSpeakers() 
    { 
      List<ISay> result = new List<ISay>(); 
      //獲取項目根目錄下的Plugins文件夾 
      string dir = Directory.GetCurrentDirectory(); 
      //遍歷目標文件夾中包含dll后綴的文件 
      foreach (var file in Directory.GetFiles(dir + @"\", "*.dll")) 
      { 
        //加載程序集 
        var asm = Assembly.LoadFrom(file); 
        //遍歷程序集中的類型 
        foreach (var type in asm.GetTypes()) 
        { 
          //如果是ISay接口 
          if (type.GetInterfaces().Contains(typeof (ISay))) 
          { 
            //創(chuàng)建接口類型實例 
            var isay = Activator.CreateInstance(type) as ISay; 
            if (isay != null) 
            { 
              result.Add(isay); 
            } 
          } 
        } 
      } 
      return result; 
    }

1

再創(chuàng)建一個類庫項目Assembly2,添加對控制臺項目的引用,并創(chuàng)建實現(xiàn)ISay接口的類:

namespace Assembly2 
{ 
  public class TwoSay : ISay 
  { 
    public void SaySth() 
    { 
      Console.WriteLine("我來自程序集2"); 
    } 
  } 
} 

右鍵類庫項目Assembly2--"屬性"--"生成",把"輸出路徑"設置成Plugins文件夾,并生成類庫項目Assembly2。

再次運行控制臺項目。

2

以上這篇C#使用反射加載多個程序集的實現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 帶你了解C++中vector的用法

    帶你了解C++中vector的用法

    大家好,本篇文章主要講的是帶你了解C++中vector的用法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 深入探索C++ string的底層實現(xiàn)

    深入探索C++ string的底層實現(xiàn)

    C語言中的字符串是以字符數(shù)組的形式存儲的,每個字符占用一個字節(jié)的內(nèi)存空間,本文我們將和大家一起深入探討一下string的底層實現(xiàn),感興趣的小伙伴快來和小編一起吧
    2023-08-08
  • C語言數(shù)據(jù)結構深入探索順序表

    C語言數(shù)據(jù)結構深入探索順序表

    順序表,全名順序存儲結構,是線性表的一種,線性表用于存儲邏輯關系為“一對一”的數(shù)據(jù),順序表自然也不例外,不僅如此,順序表對數(shù)據(jù)的物理存儲結構也有要求,跟隨下文來具體了解吧
    2022-03-03
  • C語言中的getchar()使用詳解

    C語言中的getchar()使用詳解

    大家好,本篇文章主要講的是C語言中的getchar()使用詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++核心編程之內(nèi)存分區(qū)模型詳解

    C++核心編程之內(nèi)存分區(qū)模型詳解

    這篇文章主要為大家介紹了C++核心編程中內(nèi)存分區(qū)模型,C++程序在執(zhí)行時,將內(nèi)存大方向分為四個區(qū)域,代碼區(qū),全局區(qū),棧區(qū),堆區(qū),文章通過代碼示例介紹的非常詳細,感興趣的同學可以參考閱讀下
    2023-07-07
  • Qt獲取git版本信息的具體方法

    Qt獲取git版本信息的具體方法

    這篇文章主要介紹了Qt獲取git版本信息的具體方法,今天又碰到這個問題了,想根據(jù)具體的git版本信息做代碼問題確認,文中有詳細的解決方案,具有一定的參考價值,需要的朋友可以參考下
    2024-04-04
  • C++中getline()的用法詳解

    C++中getline()的用法詳解

    這篇文章主要介紹了C++中getline()的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++?容器?Vector?的使用方法

    C++?容器?Vector?的使用方法

    這篇文章主要介紹了C++?容器?Vector?的使用方法,Vector?是一個能夠存放任意類型的動態(tài)數(shù)組,有點類似數(shù)組,是一個連續(xù)地址空間,下文更多詳細內(nèi)容的介紹,需要的小伙伴可以參考一下
    2022-06-06
  • C語言全局變量和局部變量的示例代碼

    C語言全局變量和局部變量的示例代碼

    本文主要介紹了C語言全局變量和局部變量的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 基于C語言編寫一個多功能計算器

    基于C語言編寫一個多功能計算器

    這篇文章主要為大家詳細介紹了如何基于C語言編寫一個多功能計算器,除了四則混合運算之外,還支持三角函數(shù)和絕對值等函數(shù),感興趣的小伙伴可以跟隨小編一起學習一下
    2023-08-08

最新評論

卓尼县| 全南县| 宜良县| 依兰县| 梧州市| 密云县| 邳州市| 烟台市| 万年县| 永顺县| 余江县| 密山市| 大名县| 贵德县| 贺州市| 石首市| 嫩江县| 米林县| 德保县| 铜山县| 吴江市| 普安县| 揭阳市| 武功县| 石屏县| 合阳县| 临汾市| 廊坊市| 九台市| 元谋县| 张家口市| 政和县| 吴川市| 永新县| 建阳市| 阿城市| 松滋市| 黔南| 仁布县| 济阳县| 渑池县|