サービスを取得する

さまざまな機能にアクセスするために Visual Studio サービスの取得がしばしば必要になります。 一般に、Visual Studio サービスには、使用できる 1 つ以上のインターフェイスが用意されています。 ほとんどのサービスは VSPackage から取得できます。

Package から派生し、正しくサイト設定されているすべての VSPackage では、任意のグローバル サービスを要求できます。 Package クラスでは IServiceProvider を実装するため、Package から派生するすべての VSPackage もサービス プロバイダーになります。

Visual Studio で Package を読み込むと、初期化中に IServiceProvider オブジェクトを SetSite メソッドに渡します。 これを、VSPackage のサイト設定と呼びます。 Package クラスでは、このサービス プロバイダーをラップし、サービスを取得するための GetService メソッドを提供します。

初期化された VSPackage からのサービスの取得

  1. すべての Visual Studio 拡張機能は、拡張機能アセットを格納する VSIX デプロイ プロジェクトから始まります。 GetServiceExtension という名前の Visual Studio VSIX プロジェクトを作成します。 VSIX プロジェクト テンプレートは、[新しいプロジェクト] ダイアログで「vsix」と検索すると見つかります。

  2. 次に、GetServiceCommand という名前のカスタム コマンド項目テンプレートを追加します。 [新しい項目の追加] ダイアログで、[Visual C#]>[機能拡張] の順にアクセスし、[カスタム コマンド] を選択します。 ウィンドウの下部にある [名前] フィールドで、コマンド ファイル名を GetServiceCommand.cs に変更します。 カスタム コマンドを作成する方法の詳細については、「メニュー コマンドを使用した拡張機能の作成」を参照してください

  3. GetServiceCommand.cs で、MenuItemCommand メソッドの本体を削除して次のコードを追加します。

    IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (activityLog == null) return;
    System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    
    

    このコードでは、SVsActivityLog サービスを取得し、アクティビティ ログに書き込むために使用できる IVsActivityLog インターフェイスにキャストします。 例については、「方法: アクティビティ ログを使用する」を参照してください。

  4. プロジェクトをビルドし、デバッグを開始します。 実験用インスタンスが表示されます。

  5. 実験用インスタンスの [ツール] メニューで、[GetServiceCommand の呼び出し] ボタンを探します。 このボタンをクリックすると、[アクティビティ ログ サービスが見つかりました] というメッセージ ボックスが表示されます。

ツール ウィンドウまたはコントロール コンテナーからサービスを取得する

サイト設定されていないか、必要なサービスを認識していないサービス プロバイダーでサイト設定されているツール ウィンドウまたはコントロール コンテナーからサービスを取得する必要がある場合があります。 たとえば、コントロール内からアクティビティ ログに書き込みたい場合があります。

静的 GetGlobalService メソッドは、Package から派生した VSPackage が最初にサイト設定されるときに初期化される、キャッシュされたサービス プロバイダーに依存します。

VSPackage コンストラクターは VSPackage がサイト設定される前に呼び出されるため、通常、グローバル サービスは VSPackage コンストラクター内からは使用できません。 回避策については、「方法: サービスのトラブルシューティング」を参照してください。

ツール ウィンドウまたはその他の非 VSPackage 要素でサービスを取得する方法の例を次に示します。

IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

DTE オブジェクトからサービスを取得する

DTEClass オブジェクトからサービスを取得することもできます。 ただし、VSPackage から、または静的 GetGlobalService メソッドを呼び出すことによって、DTE オブジェクトをサービスとして取得する必要があります。

DTE オブジェクトでは IServiceProvider を実装します。これを使用すると、GetService を使用してサービスのクエリを実行できます。

DTE オブジェクトからサービスを取得する方法を次に示します。

// Start with the DTE object, for example: 
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));

ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
    IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (log != null)
    {
        System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    }
}