提供服務
VSPackage 可以提供其他 VSPackage 可以使用的服務。 若要提供服務,VSPackage 必須向 Visual Studio 註冊服務並新增服務。
Package 類別會同時實作 IServiceProvider 和 IServiceContainer。 IServiceContainer 包含可依需求提供服務的回呼方法。
如需服務的詳細資訊,請參閱服務要點。
注意
即將卸載 VSPackage 時,Visual Studio 會等到 VSPackage 提供的所有服務要求都已傳遞為止。 它不會允許這些服務的新要求。 您不應該在卸載時明確呼叫 RevokeService 方法來撤銷服務。
實作服務
建立 VSIX 專案 ([檔案]>[新增]>[專案]>[Visual C#]>[擴充性]>[VSIX 專案])。
將 VSPackage 新增至專案 選取 [解決方案總管] 中的專案節點,然後按一下 [新增]>[新增項目]>[Visual C# 項目]>[擴充性]>[Visual Studio 套件]。
若要實作服務,您需要建立三種類型:
描述服務的介面。 其中許多介面都是空的,也就是說,它們沒有方法。
描述服務介面的介面。 這個介面包含要實作的方法。
實作服務和服務介面的類別。
下列範例會示範三種類型的基本實作。 服務類別的建構函式必須設定服務提供者。
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(); }
註冊服務
若要註冊服務,請將 ProvideServiceAttribute 新增至提供服務的 VSPackage。 以下是範例:
[ProvideService(typeof(SMyService))] [PackageRegistration(UseManagedResourcesOnly = true)] [Guid(VSPackage1.PackageGuidString)] public sealed class VSPackage1 : Package {. . . }
此屬性會使用 Visual Studio 註冊
SMyService
。注意
若要註冊會取代另一個同名服務的服務,請使用 ProvideServiceOverrideAttribute。 請注意,只允許一個服務覆寫。
新增服務
在 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; }
注意
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」。