DirectoryCatalog
掃描目錄中的程序集以確定導入/導出哪些類。沒有導入/導出的任何程序集都不加載。MEF的DirectoryCatalog如何工作?
這是一個很棒的功能,但它是如何工作的?要調查程序集中類型的自定義屬性,是否需要加載程序集?一旦它被加載,它就不能被卸載,所以不能如何工作。
它在做某種AppDomain的魔法嗎?
DirectoryCatalog
掃描目錄中的程序集以確定導入/導出哪些類。沒有導入/導出的任何程序集都不加載。MEF的DirectoryCatalog如何工作?
這是一個很棒的功能,但它是如何工作的?要調查程序集中類型的自定義屬性,是否需要加載程序集?一旦它被加載,它就不能被卸載,所以不能如何工作。
它在做某種AppDomain的魔法嗎?
試一試。 DirectoryCatalog
僅爲給定目錄中的每個.dll文件創建一個AssemblyCatalog
。由於AssemblyCatalog
調用的是AssemblyName.GetAssemblyName
,因此不會加載非.NET的.dll文件(拋出異常並將其捕獲到AssemblyCatalog
中)。 AssemblyCatalog
在AssemblyName
上調用Assembly.Load
它創建。因此,創建一個DirectoryCatalog
時立即加載程序集。沒有魔法,沒有AppDomains
。但是然後MEF
是衆所周知的加載組件到當前AppDomain
。如果您想要可以卸載的組件,請使用MAF。
這是可以幫助你的示例代碼。
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; }
這有助於回答我的問題嗎? – 2012-03-05 14:32:58
這是目錄編目的執行。如何使用此代碼獲取模塊, – 2012-03-06 05:33:25
這與我的問題有什麼關係? – 2012-03-06 12:58:57
不幸的是,MAF已經過時了,並且由於使用了遠程處理而帶來了很大的限制。我還沒有找到一個好的選擇。雖然我沒有意識到MEF加載了程序集。 – 2012-02-27 01:15:15
你是什麼意思「可以卸載的組件」? – Assimilater 2017-06-22 19:36:13