서비스 필수 항목
서비스는 VSPackage 두 개 간의 계약입니다. VSPackage 하나는 다른 VSPackage에서 사용할 특정 인터페이스 세트를 제공합니다. Visual Studio는 다른 VSPackages에 서비스를 제공하는 VSPackage의 자체 컬렉션입니다.
예를 들어 SVsActivityLog 서비스를 사용하여 활동 로그에 기록하는 데 사용할 수 있는 IVsActivityLog 인터페이스를 가져올 수 있습니다. 자세한 내용은 방법: 활동 로그 사용을 참조하세요.
또한 Visual Studio는 등록되지 않은 일부 기본 제공 서비스를 제공합니다. VSPackage는 서비스 재정의를 제공하여 기본 제공 서비스나 기타 서비스를 대체할 수 있습니다. 모든 서비스에 서비스 재정의 하나만 허용됩니다.
서비스를 검색할 수 없습니다. 따라서 사용하려는 서비스의 SID(서비스 식별자)를 알고 있어야 하며 서비스 식별자에서 제공하는 인터페이스를 알아야 합니다. 서비스에 대한 참조 문서에서 이 정보를 제공합니다.
서비스를 제공하는 VSPackage를 서비스 공급자라고 합니다.
다른 VSPackage에 제공되는 서비스를 전역 서비스라고 합니다.
서비스를 구현하는 VSPackage 또는 만드는 개체에서만 사용할 수 있는 서비스를 로컬 서비스라고 합니다.
기본 제공 서비스나 다른 패키지에서 제공하는 서비스를 대체하는 서비스를 서비스 재정의라고 합니다.
서비스나 서비스 재정의는 요청 시 로드됩니다. 즉, 다른 VSPackage에서 제공하는 서비스를 요청할 때 서비스 공급자가 로드됩니다.
요청 시 로드를 지원하려면 서비스 공급자가 전역 서비스를 Visual Studio에 등록합니다. 자세한 내용은 방법: 서비스 제공을 참조하세요.
서비스를 가져온 후 QueryInterface(관리되지 않는 코드) 또는 캐스팅(관리 코드)을 사용하여 원하는 인터페이스를 가져옵니다. 예를 들면 다음과 같습니다.
관리 코드는 형식별로 서비스를 참조하는 반면 비관리 코드는 GUID별로 서비스를 참조합니다.
Visual Studio에서 VSPackage를 로드할 때 VSPackage에 서비스 공급자를 전달하여 VSPackage에 전역 서비스에 대한 액세스 권한을 부여합니다. 이를 VSPackage "siting"이라고 합니다.
VSPackage는 만든 개체의 서비스 공급자일 수 있습니다. 예를 들어 양식에서 색 서비스에 대한 요청을 프레임에 보낼 수 있으며 프레임에서 이 요청을 Visual Studio에 전달될 수 있습니다.
많이 중첩되거나 전혀 배치되지 않은 관리 개체는 전역 서비스에 직접 액세스할 수 있도록 GetGlobalService를 호출할 수 있습니다.
GetGlobalService 사용
경우에 따라 도구 창이나 컨트롤 컨테이너에서 서비스를 가져와야 할 수 있으며, 그렇지 않은 경우 사용자가 원하는 서비스에 대해 알지 못하는 서비스 공급자와 함께 서비스를 받아야 할 수도 있습니다. 예를 들어 컨트롤 내에서 활동 로그에 기록할 수 있습니다. 이러한 시나리오와 다른 시나리오에 대한 자세한 내용은 방법: 서비스 문제 해결을 참조하세요.
정적 GetGlobalService 메서드를 호출하여 대부분의 Visual Studio 서비스를 가져올 수 있습니다.
GetGlobalService는 Package에서 파생된 VSPackage가 처음 배치될 때 초기화되는 캐시된 서비스 공급자를 사용합니다. 이 조건이 충족된다고 보장하거나 null 서비스를 준비해야 합니다.
다행히도 GetGlobalService는 대부분의 경우에 올바르게 작동합니다.
VSPackage가 다른 VSPackage에만 알려진 서비스를 제공하는 경우 서비스를 제공하는 VSPackage가 로드되기 전에 서비스를 요청하는 VSPackage가 배치됩니다.
VSPackage에서 도구 창을 만들면 도구 창이 생성되기 전에 VSPackage가 배치됩니다.
VSPackage에서 만든 도구 창에서 컨트롤 컨테이너를 호스트하면 VSPackage는 컨트롤 컨테이너가 생성되기 전에 배치됩니다.
도구 창이나 컨트롤 컨테이너에서 서비스 가져오기
생성자, 도구 창 또는 컨트롤 컨테이너에 다음 코드를 삽입합니다.
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog; if (log == null) return;
이 코드는 SVsActivityLog 서비스를 가져와 활동 로그에 기록하는 데 사용할 수 있는 IVsActivityLog 인터페이스로 캐스팅합니다. 예제는 방법: 활동 로그 사용을 참조하세요.