如何: 提供的服務
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
VSPackage 可提供其他 VSPackages 可以使用的服務。 若要提供服務,VSPackage 必須使用 Visual Studio 註冊服務,以及新增的服務。
封裝類別會同時實作IServiceProvider和IServiceContainer。 IServiceContainer包含隨需提供服務的回呼方法。
如需服務的詳細資訊,請參閱服務 Essentials 。
注意
將要卸載 VSPackage 時,Visual Studio 會等到所有的 VSPackage 提供服務的要求已傳送。 它不允許這些服務的新要求。 您應該明確呼叫RevokeService卸載撤銷服務的方法。
實作服務
建立 VSIX 專案 (檔案 / 新增 / 專案 / Visual C# / Extensiblity / 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 {. . . }
這個屬性會註冊
SMyService
與 Visual Studio。注意
若要註冊相同的名稱,取代另一個服務的服務,使用ProvideServiceOverrideAttribute。 請注意在允許的服務只能有一個覆寫。
新增服務
-
- VSPackage 初始設定式中加入服務,並新增回呼方法,以建立服務。 以下是可讓變更初始化方法︰
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 SMyService(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.myString; base.Initialize(); }
值
helloString
應該是"Hello"。