適用対象: 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 コンストラクターにコードがある場合は、それを Initialize
メソッドに移動します。
間違ったサービス プロバイダーが使用されている
正しいサービス プロバイダーを使用していることを確認します。
すべてのサービス プロバイダーが同じというわけではありません。 Visual Studio によってツール ウィンドウに渡されるサービス プロバイダーは、VSPackage に渡されるものとは異なります。 ツール ウィンドウ サービス プロバイダーは STrackSelectionについて認識しますが、 SVsRunningDocumentTableについて知りません。 GetGlobalService を呼び出すことによって、ツール ウィンドウ内から VSPackage サービス プロバイダーを取得できます。
ツール ウィンドウでユーザー コントロールまたはその他のコントロール コンテナーがホストされている場合、コンテナーは Windows コンポーネント モデルによってサイト化され、Visual Studio サービスにアクセスできなくなります。 GetGlobalService を呼び出すことによって、コントロールのコンテナー内から VSPackage サービス プロバイダーを取得できます。