簡體   English   中英

如何在MEF中的AggregateCatalog或DirectoryCatalog中枚舉程序集?

[英]How to enumerate assemblies within AggregateCatalog or DirectoryCatalog in MEF?

我有一個MEF(Microsoft擴展框架)應用程序,它從一個文件夾加載一些程序集。 我需要枚舉為我的應用程序生成任何導出的程序集。

一種方法是枚舉調用GetExportedObject().GetType().Assembly導入。 但如果沒有實例化進口,這樣做會更干凈。 有沒有辦法從目錄或其他任何東西獲取加載的程序集?

我需要程序集來獲取他們的屬性,如版權,版本,名稱等。 我的文件夾可以包含帶導出和沒有導出的程序集,但我只需要滿足應用程序中任何導入的程序集。

這是一種方法,用於Caliburn.Micro:

var aggregateCatalog = new AggregateCatalog(...);
var assemblies = aggregateCatalog.Parts
    .Select(part => ReflectionModelServices.GetPartType(part).Value.Assembly)
    .Distinct()
    .ToList();

這是我當前的解決方案很好地工作:

  1. 不要使用DirectoryCatalog,直接加載程序集並從中創建AssemblyCatalog。
  2. 使用AssemblyCatalog.Parts找出哪些程序集具有導出,讓用戶授權它們。
  3. 僅將授權的AssemblyCatalog添加到AggregateCatalog中,該目錄在組合中。

AssemblyCatalog具有Assembly屬性。 AggregateCatalog無法直接獲取此信息 - 無法保證內部目錄甚至可以從程序集中加載其零件。 DirectoryCatalog沒有此功能,但如果有充分的理由可以添加它。

為什么要獲取程序集列表? 您可能最好不使用目錄catalag,而只是自己掃描並加載目錄中的程序集,並為每個程序集創建一個AssemblyCatalog並將其添加到AggregateCatalog。

編輯:MEF無法獲得在合成中“使用”的所有導出列表。 您可以編寫自己的目錄,該目錄將返回圍繞默認零件定義的零件定義,並跟蹤哪些零件已在其上調用GetExportedObject。 您可以使用ReflectionModelServices中的API來確定哪個類型對應於默認目錄中的給定零件定義。 請注意,編寫此類目錄可能不是一項簡單的任務。

如果您可以訪問這些程序集的源代碼,那么我可以選擇逐個添加程序集。 您可以創建一個名為IModule的接口,並將其作為導出它的所有程序集的要求。 然后你可以將它們導入你的bootstraper:

[ImportMany]
public List<IModule> Modules { get; set; }

此列表將包含可通過其訪問程序集的所有Module類的列表:

var module1 = Logic.Instance.Modules[0];
var fullename = module1.GetType().Assembly.FullName;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM