編輯器中的 Managed Extensibility Framework
編輯器是使用 Managed Extensibility Framework (MEF) 元件建置的。 您可以建置自己的 MEF 元件來延伸編輯器,而您的程式碼也可以取用編輯器元件。
MEF 是 .NET 程式庫,可讓您新增和修改遵循 MEF 程式設計模型之應用程式或元件的功能。 Visual Studio 編輯器可以同時提供及取用 MEF 元件部分。
MEF 包含在 .NET Framework 第 4 版 System.ComponentModel.Composition.dll 組件中。
如需 MEF 的詳細資訊,請參閱 Managed Extensibility Framework (MEF)。
元件部分和組合容器
元件部分是類別或類別的成員,可以執行下列其中一項 (或兩者):
取用另一個元件
由另一個元件取用
例如,假設有訂單項目元件的採購應用程式,該元件相依於倉儲庫存元件所提供的產品供應情況資料。 在 MEF 詞彙中,庫存部分可以匯出產品供應情況資料,而訂單項目部分可以匯入資料。 訂單項目部分和庫存部分不需要彼此了解;組合容器 (由主應用程式提供) 負責維護一組匯出,以及解析匯出和匯入。
組合容器CompositionContainer通常是由主機持有。 組合容器會維護匯出元件部分的目錄。
匯出和匯入元件部分
您可以匯出任何功能,只要實作為公用類別或類別的公用成員 (屬性或方法)。 您不需要從 ComposablePart 衍生元件部分。 相反地,您必須將 ExportAttribute 屬性新增至您想要匯出的類別或類別成員。 這個屬性會指定另一個元件部分可以匯入您功能的合約。
匯出合約
定義 ExportAttribute 要匯出的項目 (類別、介面或結構)。 一般而言,export 屬性會採用參數來指定匯出的類型。
[Export(typeof(ContentTypeDefinition))]
class TestContentTypeDefinition : ContentTypeDefinition { }
根據預設,ExportAttribute 屬性會定義匯出類別類型的合約。
[Export]
[Name("Structure")]
[Order(After = "Selection", Before = "Text")]
class TestAdornmentLayerDefinition : AdornmentLayerDefinition { }
在範例中,預設 [Export]
屬性等同於 [Export(typeof(TestAdornmentLayerDefinition))]
。
您也可以匯出屬性或方法,如下列範例所示。
[Export]
[Name("Scarlet")]
[Order(After = "Selection", Before = "Text")]
public AdornmentLayerDefinition scarletLayerDefinition;
匯入 MEF 匯出
當您想要取用 MEF 匯出時,您必須知道匯出的合約 (通常是類型),並新增具有該值的 ImportAttribute 屬性。 根據預設,匯入屬性會採用一個參數,這是它修改的類別類型。 以下程式碼行匯入 IClassificationTypeRegistryService 類型。
[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;
疑難排解匯入/匯出問題:存取 MEF 組合錯誤記錄檔
如果您嘗試匯入目前 VS 安裝中不存在的項目,或您不正確地撰寫匯入或匯出,此時可能會遇到問題。 尋找並解決這些問題的主要方法是參考儲存在 %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err 的 Managed Extensibility Framework (MEF) 組合錯誤記錄檔。
從 MEF 元件部分取得編輯器功能
如果您現有的程式碼是 MEF 元件部分,您可以使用 MEF 中繼資料來取用編輯器元件部分。
從 MEF 元件部分取用編輯器功能
將參考新增至 System.Composition.ComponentModel.dll,其位於全域組件快取 (GAC),以及編輯器組件中。
新增相關的 using 指示詞。
using System.ComponentModel.Composition; using Microsoft.VisualStudio.Text;
將
[Import]
屬性新增至您的服務介面,如下所示。[Import] ITextBufferFactoryService textBufferService;
當您取得服務時,可以取用其中任何一個元件。
當您編譯組件時,請將它放入Visual Studio 安裝的 *..\Common7\IDE\Components* 資料夾。