サービスの基本情報

サービスは、2 つの VSPackage 間のコントラクトです。 ある VSPackage で、別の VSPackage で使用するインターフェイスの特定のセットが提供されます。 Visual Studio 自体は、他の VSPackage にサービスを提供する VSPackage のコレクションです。

たとえば、SVsActivityLog サービスを使用して IVsActivityLog インターフェイスを取得することができます。このインターフェイスを使用して、アクティビティ ログに書き込むことができます。 詳細については、「方法: アクティビティ ログを使用する」を参照してください。

Visual Studio には、登録されていない組み込みのサービスもいくつか用意されています。 VSPackage では、サービス オーバーライドを提供することによって、組み込みまたはその他のサービスを置き換えることができます。 サービスに対して許可されるサービス オーバーライドは 1 つだけです。

サービスには探索可能性はありません。 そのため、使用するサービスのサービス識別子 (SID) と、どのインターフェイスが提供されるかを把握しておく必要があります。 この情報は、本サービスのリファレンス ドキュメントに記載されています。

  • サービスを提供する VSPackage は、サービス プロバイダーと呼ばれます。

  • 他の VSPackage に提供されるサービスは、グローバル サービスと呼ばれます。

  • それらを実装する VSPackage、または作成した任意のオブジェクトでのみ使用できるサービスは、ローカル サービスと呼ばれます。

  • 組み込みのサービスや他のパッケージによって提供されるサービスを置き換えるサービスは、サービス オーバーライドと呼ばれます。

  • サービスまたはサービス オーバーライドは、要求時に読み込まれます。つまり、サービス プロバイダーは、提供されるサービスが別の VSPackage によって要求されたときに読み込まれます。

  • オンデマンド読み込みをサポートするには、サービス プロバイダーでグローバル サービスを Visual Studio に登録します。 詳細については、「方法: サービスを提供する」を参照してください。

  • サービスを取得した後、必要なインターフェイスを取得するには、QueryInterface (アンマネージド コード) またはキャスト (マネージド コード) を使用します。次に例を示します。

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • マネージド コードでは、その型によってサービスを参照します。一方、アンマネージド コードでは 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 インターフェイスにキャストします。 例については、「方法: アクティビティ ログを使用する」を参照してください。