提供服务
VSPackage 可以提供其他 VSPackage 可以使用的服务。 若要提供服务,VSPackage 必须将服务注册到 Visual Studio 并添加该服务。
该 Package 类实现这两个和 IServiceProvider IServiceContainer. IServiceContainer 包含按需提供服务的回调方法。
有关服务的详细信息,请参阅 服务概要 。
注意
当 VSPackage 即将卸载时,Visual Studio 会等待 VSPackage 提供的所有服务请求都已交付。 它不允许对这些服务发出新请求。 在卸载时,不应显式调用 RevokeService 方法来撤销服务。
实现服务
创建 VSIX 项目(文件>新建>项目>Visual C#>Extensibility>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。注意
若要注册将另一个服务替换为同名的服务,请使用 < a0 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”。