Visual Studio SDK でサービスを取得できない

適用対象: Visual Studio

この記事では、Visual Studio SDK で サービスを取得 できない場合の一般的な原因と解決策について説明します。

要求されたサービスを取得できない場合、 の GetService 呼び出しは null を返します。 サービスを要求した後、常に null をテストします。

IVsActivityLog log =
    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

サービスが Visual Studio に登録されていない

システム レジストリを調べて、サービスが正しく登録されているかどうかを確認します。 詳細については、「 方法: サービスを提供する」を参照してください。

次の サンプル .reg ファイル フラグメントは、SVsTextManager サービスの登録方法を示しています。

[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\<version number>\Services\{F5E7E71D-1401-11d1-883B-0000F87579D2}]
@="{F5E7E720-1401-11d1-883B-0000F87579D2}"
"Name"="SVsTextManager"

この例では、バージョン番号は Visual Studio のバージョン (12.0 や 14.0 など) であり、キー {F5E7E71D-1401-11d1-883B-0000F87579D2} はサービスのサービス識別子 (SID) であり、既定値 {F5E7E720-1401-11d1-883B-0000F87579D2} はサービスを提供するテキスト マネージャー VSPackage のパッケージ GUID です。

サービスは、サービスの種類ではなくインターフェイスの種類によって要求されます

を呼び出 GetServiceすときは、インターフェイスの種類ではなく、サービスの種類を使用します。 Visual Studio からサービスを要求するときに、 Package 型から GUID を抽出します。 次の場合、サービスは見つかりません。

  • インターフェイス型は、サービスの種類ではなく に GetService 渡されます。
  • GUID はインターフェイスに明示的に割り当てされていません。 そのため、必要に応じて、オブジェクトの既定の GUID が作成されます。

サービスを要求する VSPackage がサイト化されていない

サービスを要求する VSPackage がサイト化されていることを確認します。 Visual Studio では、VSPackage を構築した後、および を呼び出す Initialize前に VSPackage をサイト化します。

サービスを必要とする VSPackage コンストラクターにコードがある場合は、 メソッドに Initialize 移動します。

間違ったサービス プロバイダーが使用されている

正しいサービス プロバイダーを使用していることを確認してください。

すべてのサービス プロバイダーが似ているわけではありません。 Visual Studio がツール ウィンドウに渡すサービス プロバイダーは、VSPackage に渡されるサービス プロバイダーとは異なります。 ツール ウィンドウ サービス プロバイダーは について STrackSelection認識していますが、 については SVsRunningDocumentTableわかりません。 を呼び出 GetGlobalService して、ツール ウィンドウ内から VSPackage サービス プロバイダーを取得できます。

ツール ウィンドウでユーザー コントロールまたはその他のコントロール コンテナーがホストされている場合、コンテナーは Windows コンポーネント モデルによってサイト化され、Visual Studio サービスにアクセスできなくなります。 を呼び出 GetGlobalService して、コントロール コンテナー内から VSPackage サービス プロバイダーを取得できます。

関連情報