서비스 제공
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(); }
서비스 등록
서비스를 등록하려면 서비스를 제공하는 VSPackage에 ProvideServiceAttribute를 추가합니다. 예를 들어 다음과 같습니다.
[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"여야 합니다.