使用 MEF 去 Compose 指定目錄下的所有 Part,我們可能會像下面這樣透過 DirectoryCatalog 去提供 Export Parts,讓 CompositionContainer 去做 Compose。
1 | private void ComposeCurrentDirectoryParts() |
多半上面這段程式能夠運行良好。但有的時候會發生不如預期的效果,因為 DirectoryCatalog 會去找目錄下指定的檔案,可能會找到一些組件會相依於其它不存在的組件,導致發生 ReflectionTypeLoadException 錯誤。如果你碰到這樣的問題,可以避開使用 DirectoryCatalog,改成自己去遍巡處理,並用 AssemblyCatalog 載入,載入失敗則將之忽略不予處理。像是下面這樣:
1 | public class SafeDirectoryCatalog : ComposablePartCatalog |
這邊已參閱Handle ReflectionTypeLoadException during MEF composition - Stack Overflow,將之整理成可重用的類別,使用時只要將本來的 DirectoryCatalog 改成用 SafeDirectoryCatalog 就可以了。
1 | private void ComposeCurrentDirectoryParts() |