VisualStudio.Extensibility を利用する拡張機能には、通常、Visual Studioと連携するいくつかのコンポーネントがあります。
拡張機能インスタンス
拡張機能には、Extensionから派生するクラスが必要です。 実装例については、MarkdownLinter 参照してください。
Extension クラスのインスタンスは、拡張機能の実行の開始点です。 このインスタンスには、拡張機能によって提供されるサービスのクエリをVisual Studioするために必要なメソッドが含まれています。 また、拡張機能のコンポーネント間で共有されるローカライズされたリソースと拡張機能所有のローカル サービスを提供するための仮想メソッドも提供します。
[VisualStudioContribution]
public class MarkdownLinterExtension : Extension
{
/// <inheritdoc/>
public override ExtensionConfiguration ExtensionConfiguration => new()
{
Metadata = new(
id: "MarkdownLinter.0cf26ba2-edd5-4419-8646-a55d0a83f7d8",
version: this.ExtensionAssemblyVersion,
publisherName: "Microsoft",
displayName: "Markdown Linter Sample Extension",
description: "Sample markdown linter extension"),
};
...
既存の VSSDK API に精通している拡張機能開発者の場合、Metadata に含まれる ExtensionConfiguration を使用して、.vsixmanifest ファイルが生成されます。 また、Extension クラスは、VSSDK 拡張機能モデルで使用される AsyncPackage クラスに似ています。
VisualStudioExtensibility オブジェクト
オブジェクト VisualStudioExtensibility は、Visual Studioによって公開される機能拡張機能のエントリ ポイントとして機能します。 このクラスには、拡張 SDK で使用可能な機能をすばやく列挙するためのさまざまな拡張メソッド、プロパティがあります。 使用可能なメソッドについては、API のドキュメントを参照してください。
拡張パーツ
拡張機能がコマンド、エディター リスナー、ツール ウィンドウなどのVisual Studioにコンポーネントを提供する機能の場合、拡張機能では、VisualStudioContribution 属性でマークされたクラスが使用されます。 ビルド プロセスによって正しいメタデータが生成され、Visual Studioによってこれらのコンポーネントを検出できるようになります。
現在、SDK では、提供されるコンポーネントの限られたセットがサポートされています。
- コマンド ハンドラー
- ツール ウィンドウ
- テキスト ビューの作成イベントや終了イベントを追跡するための、テキスト ビュー開閉リスナー。
- テキスト ビューの変更リスナー、開いているテキスト ビューへの変更を追跡します。
- マージン プロバイダー
- デバッガー ビジュアライザー
これらのクラスのインスタンスは、依存関係挿入ライブラリを使用して SDK によって提供される拡張フレームワークの一部として作成され、コンストラクターを使用して、SDK または拡張機能自体によって提供されるサービスのインスタンスを取得して、コンポーネント間で状態を共有できます。
延長部品の有効期間
各パーツの有効期間は、Visual Studio IDEプロセス内でそれらのパーツを読み込む各コンポーネントによって管理されます。
コマンド ハンドラーは、対応するコマンド セットがアクティブ化されるときに初期化されます。これは、コマンドの最初の実行中に発生する可能性があります。 アクティブ化されたコマンド ハンドラーは、IDE がシャットダウンされたときにのみ破棄する必要があります。
同様に、テキスト ビュー イベント リスナーは、指定されたコンテンツ タイプに一致する最初のテキスト ビューが IDE に読み込まれるときに初期化されます。 現在、このようなリスナーは IDE がシャットダウンされるまでアクティブですが、この動作は将来変更される可能性があります。
一般に、複雑な拡張機能の場合、拡張機能では、パーツがコンストラクターにインポートできるローカル サービスを提供し、それらのサービスを使用して、同じパーツの複数のパーツ間およびインスタンス間で状態を共有することをお勧めします。 この方法により、拡張パーツの有効期間の変更によって拡張機能の状態が影響を受けないようにします。
挿入およびローカル拡張サービス用に SDK によって提供されるサービス
VisualStudio.Extensibility SDK は依存関係の挿入を利用して、コンポーネントが組み込みサービスと拡張機能によって提供されるサービスの両方をローカルで取り込み、異なるコンポーネント間で共有できるようにします。 SDK によって提供されるサービス、サービスの有効期間、依存関係 の挿入 のユース ケースの例の詳細については、依存関係の挿入に関するセクションを参照してください。
ローカル サービスの使用方法の例については、MarkdownLinter 拡張機能を参照してください。
クライアント コンテキスト
新しい SDK のすべての拡張機能ではプロセスが不足するため、イベントまたはメソッドが呼び出されたときの IDE の状態を表すさまざまな拡張パーツのクライアント コンテキストの概念を紹介します。 このコンテキストは SDK の IClientContext インスタンスによって表され、コマンド実行ハンドラーなどのさまざまな操作に渡されます。 SDK には、コンテキストからオブジェクトを取得するために使用できる IClientContext の拡張メソッドが用意されています。 たとえば、拡張機能は、IClientContext インスタンスを使用してコマンドの実行時に、選択した項目のアクティブなテキスト ビューまたは URI を取得できます。
コマンドなどの一部のコンポーネントでは、関心のあるコンテキストを宣言することもできます。 これは、クライアント コンテキストが将来大きくなる可能性があるため、各リモート実行で転送されるデータの量を最適化するために行われます。 初期プレビューでは、Shell と Editorの 2 つのコンテキストしか使用できません。この両方は、CommandAttributeを使用してコマンドを宣言するときに既定で含まれます。