Below you will find pages that utilize the taxonomy term “MEF”
Posts
Mefx - MEF Composition Analysis Tool
Mefx 是一用來分析與診斷 MEF 錯誤的命令列工具。當 MEF 在運作上不如預期時,我們可藉由此工具下去做些查驗。
程式主檔可至 Managed Extensibility Framework - Download: MEF Analysis Tool (mefx) for .NET 4.0 Beta 這邊下載。
{% img /images/posts/Mefx/1.png %}
命令列的使用語法如下:
mefx [files and directories] [action] [options] 使用時首先要帶入 /file 或是 /dir 參數,並指定要進行分析的檔案或目錄。
mefx /file:MyAddIn.dll /directory:Program\AddIns [action...] 接著視需要加入其它參數。像是在後面帶入 /parts 參數用以查閱組件內內含哪些可以使用的 part。
mefx /file:MyAddIn.dll /parts 帶入 /type 查閱特定的 part。
mefx /file:MyAddIn.dll /type:MyAddIn.AddIn 或是帶入 /imports 查閱 import 點。
mefx /file:MyAddIn.dll /imports 帶入 /exports 查閱 export 點。
mefx /file:MyAddIn.dll /exports 帶入 /verbose 顯示更為詳細的資訊。
read morePosts
MEF - Handle ReflectionTypeLoadException during MEF composition
使用 MEF 去 Compose 指定目錄下的所有 Part,我們可能會像下面這樣透過 DirectoryCatalog 去提供 Export Parts,讓 CompositionContainer 去做 Compose。
private void ComposeCurrentDirectoryParts() { using (var catalog = new DirectoryCatalog(Environment.CurrentDirectory)) using (var container = new CompositionContainer(catalog)) { container.ComposeParts(this); } } 多半上面這段程式能夠運行良好。但有的時候會發生不如預期的效果,因為 DirectoryCatalog 會去找目錄下指定的檔案,可能會找到一些組件會相依於其它不存在的組件,導致發生 ReflectionTypeLoadException 錯誤。如果你碰到這樣的問題,可以避開使用 DirectoryCatalog,改成自己去遍巡處理,並用 AssemblyCatalog 載入,載入失敗則將之忽略不予處理。像是下面這樣:
public class SafeDirectoryCatalog : ComposablePartCatalog { #region Fields private AggregateCatalog _catalog; #endregion Fields #region Properties /// <summary> /// Gets the catalog. /// </summary> /// <value> /// The catalog. /// </value> private AggregateCatalog m_Catalog { get { return _catalog ?
read morePosts
[C#]MEF開發系列 - Managed Extensibility Framework(MEF)的概念與簡介
public MainForm() { InitializeComponent(); var catalog = new DirectoryCatalog(Environment.CurrentDirectory, "*.dll"); var container = new CompositionContainer(catalog); container.ComposeParts(this); foreach (IModule module in Modules) { module.Host = this; 模組MToolStripMenuItem.DropDownItems.Add(module.Name, null, Module_Click).Tag = module; } } ... } }
read more