多くの場合、さまざまな機能にアクセスするには、Visual Studio サービスを取得する必要があります。 一般に、Visual Studio サービスには、使用できる 1 つ以上のインターフェイスが用意されています。 ほとんどのサービスは VSPackage から取得できます。
Packageから派生し、正しくサイト化された VSPackage は、グローバル サービスを要求できます。
Package
クラスはIServiceProviderを実装するため、Package
から派生するすべての VSPackage もサービス プロバイダーです。
Visual Studio は、 Packageを読み込むと、初期化中に IServiceProvider オブジェクトを SetSite メソッドに渡します。 これは VSPackage の配置 と呼ばれます。
Package
クラスは、このサービス プロバイダーをラップし、サービスを取得するためのGetServiceメソッドを提供します。
初期化された VSPackage からサービスを取得する
すべての Visual Studio 拡張機能は、拡張機能資産を含む VSIX デプロイ プロジェクトで始まります。
GetServiceExtension
という名前の Visual Studio VSIX プロジェクトを作成します。 VSIX プロジェクト テンプレートは、[ 新しいプロジェクト ] ダイアログで "vsix" を検索することで確認できます。次に、 GetServiceCommand という名前のカスタム コマンド項目テンプレートを追加します。 [ 新しい項目の追加 ] ダイアログで、 Visual C#>Extensibility に移動し、[ カスタム コマンド] を選択します。 ウィンドウの下部にある [名前 ] フィールドで、コマンド ファイル名を GetServiceCommand.csに変更します。 カスタム コマンドを作成する方法の詳細については、メニュー コマンドを使用して拡張機能を作成する
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 インターフェイスにキャストします。 例については、「 方法: アクティビティ ログを使用する」を参照してください。
プロジェクトをビルドし、デバッグを開始します。 実験用インスタンスが表示されます。
実験用インスタンスの [ツール ] メニューで、[ GetServiceCommand の呼び出し ] ボタンを見つけます。 このボタンをクリックすると、アクティビティ ログ サービスが見つかりましたというメッセージ ボックスが表示されます。
ツール ウィンドウまたはコントロール コンテナーからサービスを取得する
場合によっては、サイト化されていないツール ウィンドウまたはコントロール コンテナーからサービスを取得する必要がある場合や、必要なサービスを知らないサービス プロバイダーにサイト化されている場合があります。 たとえば、コントロール内からアクティビティ ログに書き込む場合があります。
静的 GetGlobalService メソッドは、 Package から派生した VSPackage が初めてサイト化されるときに初期化される、キャッシュされたサービス プロバイダーに依存します。
VSPackage コンストラクターは VSPackage がサイト化される前に呼び出されるため、通常、グローバル サービスは VSPackage コンストラクター内から使用できません。 回避策については、「 方法: サービスのトラブルシューティング 」を参照してください。
ツール ウィンドウまたはその他の VSPackage 以外の要素でサービスを取得する方法の例を次に示します。
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;
DTE オブジェクトからサービスを取得する
DTEClassオブジェクトからサービスを取得することもできます。 ただし、サービスとして DTE オブジェクトを VSPackage から取得するか、静的な GetGlobalService メソッドを呼び出す必要があります。
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.");
}
}