.NET 程序集Assembly使用


概述

  一直以來,我們都在用C#編寫程序,編寫程序的時候,我們用到繼承、多態、接口以及泛型,我們也都明白子類可以繼承抽象類,並能夠重寫父類的抽象方法,可是大家是否想過,如下幾個問題:

  1、凡樹必有根和葉,類的繼承也如此,如何通過程序集查找所有繼承父類的之類的程序集名稱?

  2、如果程序B被其他程序調用,如何通過程序集查詢調用B的所有程序?

  3、如何查詢當前項目通過添加引用了哪些程序集?

帶上上面的三個問題,我們來學習下.NET 程序集 Assembly。

查詢繼承父類的程序集合BaseType

  .NET的程序集對象Assembly有個屬性BaseType,來返回當前程序集的基礎類型,默認是Object。通過該屬性可以判斷某個程序集是否是繼承了某個父類;

程序集B被A程序引用,獲取A程序集的信息GetCallingAssembly

  .NET的程序集對象Assembly有個方法GetCallingAssembly獲取當前程序集被調用的上級程序集的信息;

查找當前項目的程序集GetAssemblies

  查找當前項目所有程序集的方法System.AppDomain.CurrentDomain.GetAssemblies();

實例化對象

  通過程序集GetType()獲取程序集的數據類型,通過Activator.CreateInstance(type) 便可創建響應的實例對象;

     整體使用的代碼如下:BaseService是所有服務類的基類

            List<Type> TypeItemList = new List<Type>();
            //var ResultTypeList = Assembly.GetEntryAssembly();
            //if (ResultTypeList == null)
            //{
            //    ResultTypeList = Assembly.GetCallingAssembly();
            //    var ItemList = ResultTypeList.GetReferencedAssemblies().Where(p => p.GetType() == typeof(BaseService));                
            //}
            Assembly[] AssbyCustmList = System.AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly assItem in AssbyCustmList)
            {
                TypeItemList.AddRange(assItem.GetTypes().Where(x => x.BaseType == typeof(BaseService)).ToList());
            }
            //IEnumerable<Type> TypeItemList = CurType.Assembly.GetExportedTypes().Where(x => x.BaseType == typeof(BaseService)).ToList();
            //IEnumerable<Type> TypeItemList = ResultTypeList.GetTypes().Where(x => x.BaseType == typeof(BaseService)).ToList();
            BaseService TarService = null;
            foreach (Type typeitem in TypeItemList)
            {
                if (_Reporttory.Count(p => p.GetType() == typeitem) == 0)
                {
                    TarService = (Activator.CreateInstance(typeitem) as BaseService);
                }
                else
                {
                    TarService = _Reporttory.First(p => p.GetType() == typeitem);
                }
                TarService.Start();
            }         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM