다음을 통해 공유


서비스 필수 항목

서비스는 VSPackage 두 개 간의 계약입니다. VSPackage 하나는 다른 VSPackage에서 사용할 특정 인터페이스 세트를 제공합니다. Visual Studio는 다른 VSPackages에 서비스를 제공하는 VSPackage의 자체 컬렉션입니다.

예를 들어 SVsActivityLog 서비스를 사용하여 활동 로그에 기록하는 데 사용할 수 있는 IVsActivityLog 인터페이스를 가져올 수 있습니다. 자세한 내용은 방법: 활동 로그 사용을 참조하세요.

또한 Visual Studio는 등록되지 않은 일부 기본 제공 서비스를 제공합니다. VSPackage는 서비스 재정의를 제공하여 기본 제공 서비스나 기타 서비스를 대체할 수 있습니다. 모든 서비스에 서비스 재정의 하나만 허용됩니다.

서비스를 검색할 수 없습니다. 따라서 사용하려는 서비스의 SID(서비스 식별자)를 알고 있어야 하며 서비스 식별자에서 제공하는 인터페이스를 알아야 합니다. 서비스에 대한 참조 문서에서 이 정보를 제공합니다.

  • 서비스를 제공하는 VSPackage를 서비스 공급자라고 합니다.

  • 다른 VSPackage에 제공되는 서비스를 전역 서비스라고 합니다.

  • 서비스를 구현하는 VSPackage 또는 만드는 개체에서만 사용할 수 있는 서비스를 로컬 서비스라고 합니다.

  • 기본 제공 서비스나 다른 패키지에서 제공하는 서비스를 대체하는 서비스를 서비스 재정의라고 합니다.

  • 서비스나 서비스 재정의는 요청 시 로드됩니다. 즉, 다른 VSPackage에서 제공하는 서비스를 요청할 때 서비스 공급자가 로드됩니다.

  • 요청 시 로드를 지원하려면 서비스 공급자가 전역 서비스를 Visual Studio에 등록합니다. 자세한 내용은 방법: 서비스 제공을 참조하세요.

  • 서비스를 가져온 후 QueryInterface(관리되지 않는 코드) 또는 캐스팅(관리 코드)을 사용하여 원하는 인터페이스를 가져옵니다. 예를 들면 다음과 같습니다.

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • 관리 코드는 형식별로 서비스를 참조하는 반면 비관리 코드는 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 인터페이스로 캐스팅합니다. 예제는 방법: 활동 로그 사용을 참조하세요.