共用方式為


編輯器中的 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.errManaged Extensibility Framework (MEF) 組合錯誤記錄檔

從 MEF 元件部分取得編輯器功能

如果您現有的程式碼是 MEF 元件部分,您可以使用 MEF 中繼資料來取用編輯器元件部分。

從 MEF 元件部分取用編輯器功能

  1. 將參考新增至 System.Composition.ComponentModel.dll,其位於全域組件快取 (GAC),以及編輯器組件中。

  2. 新增相關的 using 指示詞。

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. [Import] 屬性新增至您的服務介面,如下所示。

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. 當您取得服務時,可以取用其中任何一個元件。

  5. 當您編譯組件時,請將它放入Visual Studio 安裝的 *..\Common7\IDE\Components* 資料夾。