2012-02-26 59 views
6

DirectoryCatalog掃描目錄中的程序集以確定導入/導出哪些類。沒有導入/導出的任何程序集都不加載。MEF的DirectoryCatalog如何工作?

這是一個很棒的功能,但它是如何工作的?要調查程序集中類型的自定義屬性,是否需要加載程序集?一旦它被加載,它就不能被卸載,所以不能如何工作。

它在做某種AppDomain的魔法嗎?

回答

10

試一試。 DirectoryCatalog僅爲給定目錄中的每個.dll文件創建一個AssemblyCatalog。由於AssemblyCatalog調用的是AssemblyName.GetAssemblyName,因此不會加載非.NET的.dll文件(拋出異常並將其捕獲到AssemblyCatalog中)。 AssemblyCatalogAssemblyName上調用Assembly.Load它創建。因此,創建一個DirectoryCatalog時立即加載程序集。沒有魔法,沒有AppDomains。但是然後MEF是衆所周知的加載組件到當前AppDomain。如果您想要可以卸載的組件,請使用MAF

+0

不幸的是,MAF已經過時了,並且由於使用了遠程處理而帶來了很大的限制。我還沒有找到一個好的選擇。雖然我沒有意識到MEF加載了程序集。 – 2012-02-27 01:15:15

+0

你是什麼意思「可以卸載的組件」? – Assimilater 2017-06-22 19:36:13

1

這是可以幫助你的示例代碼。

var directoryPath = "Dll folder path"; 

//Load parts from the available dlls in the specified path using the directory catalog 
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll"); 

//Creating an instance of aggregate catalog. It aggregates other catalogs 
var aggregateCatalog = new AggregateCatalog(); 
aggregateCatalog.Catalogs.Add(directoryCatalog); 

//Crete the composition container 
var container = new CompositionContainer(aggregateCatalog); 

container.ComposeParts(this); 


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

這有助於回答我的問題嗎? – 2012-03-05 14:32:58

+0

這是目錄編目的執行。如何使用此代碼獲取模塊, – 2012-03-06 05:33:25

+4

這與我的問題有什麼關係? – 2012-03-06 12:58:57