서비스 가져오기
Visual Studio 서비스를 사용하여 다양한 기능에 액세스해야 하는 경우가 많습니다. 일반적으로 Visual Studio 서비스는 사용할 수 있는 하나 이상의 인터페이스를 제공합니다. VSPackage에서 대부분의 서비스를 가져올 수 있습니다.
Package에서 파생되고 올바르게 사이트된 모든 VSPackage는 전역 서비스를 요청할 수 있습니다. Package
클래스가 IServiceProvider를 구현하기 때문에 Package
에서 파생되는 모든 VSPackage도 서비스 공급자입니다.
Visual Studio가 Package를 로드하면 초기화 중에 IServiceProvider 개체를 SetSite 메서드에 전달합니다. 이를 VSPackage의 사이트라고 합니다. Package
클래스는 이 서비스 공급자를 래핑하고 서비스를 가져오기 위한 GetService 메서드를 제공합니다.
초기화된 VSPackage에서 서비스 가져오기
모든 Visual Studio 확장은 확장 자산을 포함하는 VSIX 배포 프로젝트로 시작합니다.
GetServiceExtension
이라는 Visual Studio VSIX 프로젝트를 만듭니다. “vsix”를 검색하여 새 프로젝트 대화 상자에서 VSIX 프로젝트 템플릿을 찾을 수 있습니다.이제 GetServiceCommand라는 사용자 지정 명령 항목 템플릿을 추가합니다. 새 항목 추가 대화 상자에서 Visual C#>확장성으로 이동하여 사용자 지정 명령을 선택합니다. 창 아래쪽의 이름 필드에서 명령 파일 이름을 GetServiceCommand.cs로 변경합니다. 사용자 지정 명령을 만드는 방법에 대한 자세한 내용은 메뉴 명령을 사용하여 확장 만들기를 참조하세요.
GetServiceCommand.cs에서
MenuItemCommand
메서드의 본문을 제거하고 다음 코드를 추가합니다.IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog; if (activityLog == null) return; System.Windows.Forms.MessageBox.Show("Found the activity log service.");
이 코드는 SVsActivityLog 서비스를 가져와 활동 로그에 쓰는 데 사용할 수 있는 IVsActivityLog 인터페이스로 캐스팅합니다. 예를 들어, 방법: 활동 로그 사용을 참조하세요.
프로젝트를 빌드하고 디버깅을 시작합니다. 실험적 인스턴스가 나타납니다.
실험적 인스턴스의 도구 메뉴에서 GetServiceCommand 호출 단추를 찾습니다. 이 단추를 클릭하면 활동 로그 서비스를 찾았습니다.는 메시지 상자가 표시됩니다.
도구 창 또는 컨트롤 컨테이너에서 서비스 가져오기
경우에 따라 도구 창이나 컨트롤 컨테이너에서 서비스를 가져와야 할 수 있으며, 그렇지 않은 경우 사용자가 원하는 서비스에 대해 알지 못하는 서비스 공급자와 함께 서비스를 받아야 할 수도 있습니다. 예를 들어 컨트롤 내에서 활동 로그에 기록할 수 있습니다.
정적 GetGlobalService 메서드는 Package에서 파생된 VSPackage가 처음 사이트될 때 초기화되는 캐시된 서비스 공급자를 사용합니다.
VSPackage 생성자는 VSPackage가 사이트되기 전에 호출되기 때문에 일반적으로 VSPackage 생성자 내에서 전역 서비스를 사용할 수 없습니다. 해결 방법에 대해서는 방법: 서비스 문제 해결을 참조하세요.
도구 창 또는 다른 비 VSPackage 요소에서 서비스를 가져오는 방법의 예는 다음과 같습니다.
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;
DTE 개체에서 서비스 가져오기
DTEClass 개체에서 서비스를 가져올 수도 있습니다. 그러나 VSPackage에서 또는 정적 GetGlobalService 메서드를 호출하여 DTE 개체를 서비스로 가져와야 합니다.
DTE 개체는 IServiceProvider를 사용하여 서비스를 쿼리하는 데 사용할 수 있는 GetService를 구현입니다.
DTE 개체에서 서비스를 가져오는 방법은 다음과 같습니다.
// Start with the DTE object, for example:
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));
ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log != null)
{
System.Windows.Forms.MessageBox.Show("Found the activity log service.");
}
}