エディターは、Managed Extensibility Framework (MEF) コンポーネントを使用して構築されます。 独自の MEF コンポーネントをビルドしてエディターを拡張し、コードでエディター コンポーネントを使用することもできます。
MEF は、MEF プログラミング モデルに従うアプリケーションまたはコンポーネントの機能を追加および変更できる .NET ライブラリです。 Visual Studio エディターでは、MEF コンポーネント パーツの提供と使用の両方を行うことができます。
MEF は、.NET Framework バージョン 4 System.ComponentModel.Composition.dllアセンブリに 含まれています。
MEF の詳細については、「 Managed Extensibility Framework (MEF)」を参照してください。
コンポーネントパーツとコンポジションコンテナ
コンポーネント パーツは、次のいずれか (または両方) を実行できるクラスまたはクラスのメンバーです。
別のコンポーネントを使用する
別のコンポーネントに取り込まれる
たとえば、倉庫在庫コンポーネントによって提供される製品の可用性データに依存する注文エントリ コンポーネントを持つショッピング アプリケーションを考えてみましょう。 MEF 用語では、在庫パーツは製品の可用性データを エクスポート でき、注文エントリ パーツはデータを インポート できます。 注文入力パーツと在庫パーツは、互いについて知る必要はありません。(ホスト アプリケーションによって提供される) コンポジション コンテナー は、一連のエクスポートを維持し、エクスポートとインポートを解決する役割を担います。
コンポジション コンテナー CompositionContainerは、通常、ホストによって所有されます。 コンポジション コンテナーは、エクスポートされたコンポーネント パーツの カタログ を保持します。
コンポーネント パーツのエクスポートとインポート
パブリック クラスまたはクラス (プロパティまたはメソッド) のパブリック メンバーとして実装されている限り、任意の機能をエクスポートできます。 ComposablePartからコンポーネント パーツを派生させる必要はありません。 代わりに、エクスポートするクラスまたはクラス メンバーに ExportAttribute 属性を追加する必要があります。 この属性は、別のコンポーネント パーツが機能をインポートできる コントラクト を指定します。
エクスポート コントラクト
ExportAttributeは、エクスポートするエンティティ (クラス、インターフェイス、または構造体) を定義します。 通常、エクスポート属性は、エクスポートの種類を指定するパラメーターを受け取ります。
[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 属性を追加する必要があります。 既定では、import 属性は、変更するクラスの型である 1 つのパラメーターを受け取ります。 次のコード行は、 IClassificationTypeRegistryService 型をインポートします。
[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;
インポート/エクスポートに関する問題のトラブルシューティング: MEF コンポジション エラー ログにアクセスする
現在の VS インストールに存在しないものをインポートしようとした場合、またはインポートまたはエクスポートを誤って作成した場合は、問題が発生する可能性があります。 これらの問題を見つけて対処する主な方法は、%localappdata% \Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err に格納されている Managed Extensibility Framework (MEF) コンポジション エラー ログを参照することです。
MEF コンポーネント パーツからエディター機能を取得する
既存のコードが MEF コンポーネント パーツである場合は、MEF メタデータを使用してエディター コンポーネント パーツを使用できます。
MEF コンポーネント パーツからエディター機能を使用するには
グローバル アセンブリ キャッシュ (GAC) 内にある System.Composition.ComponentModel.dllへの参照とエディター アセンブリへの参照を追加します。
関連する using ディレクティブを追加します。
using System.ComponentModel.Composition; using Microsoft.VisualStudio.Text;次のように、
[Import]属性をサービス インターフェイスに追加します。[Import] ITextBufferFactoryService textBufferService;サービスを取得したら、そのコンポーネントのいずれかを使用できます。
アセンブリをコンパイルしたら、Visual Studio インストールの *..\Common7\IDE\Components* フォルダーに配置してください。