サービスの基本情報
サービスは、2 つの VSPackage 間のコントラクトです。 ある VSPackage で、別の VSPackage で使用するインターフェイスの特定のセットが提供されます。 Visual Studio 自体は、他の VSPackage にサービスを提供する VSPackage のコレクションです。
たとえば、SVsActivityLog サービスを使用して IVsActivityLog インターフェイスを取得することができます。このインターフェイスを使用して、アクティビティ ログに書き込むことができます。 詳細については、「方法: アクティビティ ログを使用する」を参照してください。
Visual Studio には、登録されていない組み込みのサービスもいくつか用意されています。 VSPackage では、サービス オーバーライドを提供することによって、組み込みまたはその他のサービスを置き換えることができます。 サービスに対して許可されるサービス オーバーライドは 1 つだけです。
サービスには探索可能性はありません。 そのため、使用するサービスのサービス識別子 (SID) と、どのインターフェイスが提供されるかを把握しておく必要があります。 この情報は、本サービスのリファレンス ドキュメントに記載されています。
サービスを提供する VSPackage は、サービス プロバイダーと呼ばれます。
他の VSPackage に提供されるサービスは、グローバル サービスと呼ばれます。
それらを実装する VSPackage、または作成した任意のオブジェクトでのみ使用できるサービスは、ローカル サービスと呼ばれます。
組み込みのサービスや他のパッケージによって提供されるサービスを置き換えるサービスは、サービス オーバーライドと呼ばれます。
サービスまたはサービス オーバーライドは、要求時に読み込まれます。つまり、サービス プロバイダーは、提供されるサービスが別の VSPackage によって要求されたときに読み込まれます。
オンデマンド読み込みをサポートするには、サービス プロバイダーでグローバル サービスを Visual Studio に登録します。 詳細については、「方法: サービスを提供する」を参照してください。
サービスを取得した後、必要なインターフェイスを取得するには、QueryInterface (アンマネージド コード) またはキャスト (マネージド コード) を使用します。次に例を示します。
マネージド コードでは、その型によってサービスを参照します。一方、アンマネージド コードでは GUID によってサービスを参照します。
Visual Studio で VSPackage が読み込まれると、サービス プロバイダーが VSPackage に渡され、VSPackage でグローバル サービスにアクセスできるようになります。 これを、VSPackage の "サイト設定" と呼びます。
VSPackage は、作成するオブジェクトのサービス プロバイダーにすることができます。 たとえば、フォームでカラー サービスの要求をそのフレームに送信すると、要求が Visual Studio に渡されることがあります。
深い入れ子になっている、またはまったくサイト設定されていないマネージド オブジェクトでは、グローバル サービスに直接アクセスするために GetGlobalService を呼び出すことができます。
GetGlobalService を使用する
サイト設定されていないか、必要なサービスを認識していないサービス プロバイダーでサイト設定されているツール ウィンドウまたはコントロール コンテナーからサービスを取得する必要がある場合があります。 たとえば、コントロール内からアクティビティ ログに書き込みたい場合があります。 これらのシナリオとその他のシナリオの詳細については、「方法: サービスのトラブルシューティング」を参照してください。
ほとんどの Visual Studio サービスは、静的 GetGlobalService メソッドを呼び出すことによって取得できます。
GetGlobalService は、パッケージから派生した VSPackage が最初にサイト設定されるときに初期化される、キャッシュされたサービス プロバイダーに依存します。 この条件を満たしていることを保証するか、null サービス用に準備する必要があります。
幸い、GetGlobalService はほとんどの場合正常に動作します。
VSPackage で、別の VSPackage だけを認識するサービスが提供される場合、サービスを要求する VSPackage は、サービスを提供する VSPackage が読み込まれる前にサイト設定されます。
ツール ウィンドウが VSPackage によって作成された場合、ツール ウィンドウが作成される前に VSPackage がサイト設定されます。
コントロール コンテナーが、VSPackage によって作成されたツール ウィンドウによってホストされている場合、VSPackage はコントロール コンテナーが作成される前にサイト設定されます。
ツール ウィンドウまたはコントロール コンテナー内からサービスを取得するには
コンストラクター、ツール ウィンドウ、またはコントロール コンテナーに次のコードを挿入します。
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog; if (log == null) return;
このコードでは、SVsActivityLog サービスを取得し、アクティビティ ログに書き込むために使用できる IVsActivityLog インターフェイスにキャストします。 例については、「方法: アクティビティ ログを使用する」を参照してください。