サービスを提供する
VSPackage では、他の Vspackage で使用できるサービスを提供できます。 サービスを提供するには、VSPackage で Visual Studio にサービスを登録し、サービスを追加する必要があります。
Package クラスは、IServiceProvider と IServiceContainer の両方を実装しています。 IServiceContainer には、要求時にサービスを提供するコールバック メソッドを格納します。
サービスの詳細については、「サービスの基本情報」を参照してください。
Note
VSPackage がアンロードされるとき、Visual Studio では、VSPackage で提供するサービスのすべての要求が配信されるまで待機します。 これらのサービスに対して新しい要求を行うことはできません。 RevokeService メソッドを明示的に呼び出して、アンロード時にサービスを取り消すことはできません。
サービスを実装する
VSIX プロジェクトを作成します ([ファイル]>[新規作成]>[プロジェクト]>[Visual C#]>[機能拡張]>[VSIX プロジェクト])。
VSPackage をプロジェクトに追加します。 ソリューション エクスプローラーでプロジェクト ノードを選択し、[追加]>[新しい項目]>[Visual C# アイテム]>[機能拡張]>[Visual Studio パッケージ] の順にクリックします。
サービスを実装するには、次の 3 種類を作成する必要があります。
サービスを記述するインターフェイス。 これらのインターフェイスの多くは空です。つまり、メソッドはありません。
サービス インターフェイスを記述するインターフェイス。 このインターフェイスには、実装するメソッドが含まれています。
サービスとサービス インターフェイスの両方を実装するクラス。
次の例に、3 つの種類の基本的な実装を示します。 サービス クラスのコンストラクターでは、サービス プロバイダーを設定する必要があります。
public class MyService : SMyService, IMyService { private Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider; private string myString; public MyService(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp) { Trace.WriteLine( "Constructing a new instance of MyService"); serviceProvider = sp; } public void Hello() { myString = "hello"; } public string Goodbye() { return "goodbye"; } } public interface SMyService { } public interface IMyService { void Hello(); string Goodbye(); }
サービスを登録する
サービスを登録するには、サービスを提供する VSPackage に ProvideServiceAttribute を追加します。 例を次に示します。
[ProvideService(typeof(SMyService))] [PackageRegistration(UseManagedResourcesOnly = true)] [Guid(VSPackage1.PackageGuidString)] public sealed class VSPackage1 : Package {. . . }
この属性では、
SMyService
を Visual Studio に登録します。Note
名前が同じ別のサービスを置き換えるサービスを登録するには、ProvideServiceOverrideAttribute を使用します。 サービスのオーバーライドは 1 つしか許可されないことに注意してください。
サービスの追加
VSPackage 初期化子で、サービスを追加し、サービスを作成するコールバック メソッドを追加します。 Initialize メソッドに対して行う変更は次のとおりです。
protected override void Initialize() { ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService); ((IServiceContainer)this).AddService(typeof(SMyService), callback); . . . }
サービスを作成して返し、作成できない場合は null を返すコールバック メソッドを実装します。
private object CreateService(IServiceContainer container, Type serviceType) { if (typeof(SMyService) == serviceType) return new MyService(this); return null; }
Note
Visual Studio では、サービスを提供する要求を拒否できます。 これは、別の VSPackage で既にサービスを提供している場合に行います。
サービスを取得し、そのメソッドを使用できるようになりました。 次の例は、初期化子でサービスを使用する方法を示していますが、サービスを使用する任意の場所でサービスを取得できます。
protected override void Initialize() { ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService); ((IServiceContainer)this).AddService(typeof(SMyService), callback); MyService myService = (MyService) this.GetService(typeof(SMyService)); myService.Hello(); string helloString = myService.Goodbye(); base.Initialize(); }
helloString
の値は "Hello" にする必要があります。