Podstawowe informacje o usłudze
Usługa jest kontraktem między dwoma pakietami VSPackage. Jeden pakiet VSPackage udostępnia określony zestaw interfejsów dla innego pakietu VSPackage do użytku. Program Visual Studio jest kolekcją pakietów VSPackage, która udostępnia usługi innym pakietom VSPackage.
Na przykład można użyć usługi SVsActivityLog, aby uzyskać interfejs IVsActivityLog, którego można użyć do zapisu w dzienniku aktywności. Aby uzyskać więcej informacji, zobacz How to: Use the Activity Log (Instrukcje: używanie dziennika aktywności).
Program Visual Studio udostępnia również niektóre wbudowane usługi, które nie są zarejestrowane. Pakiety VSPackage mogą zastąpić wbudowane lub inne usługi, zapewniając zastąpienie usługi. Tylko jedno zastąpienie usługi jest dozwolone dla dowolnej usługi.
Usługi nie mają możliwości odnajdywania. W związku z tym musisz znać identyfikator usługi (SID) usługi, którą chcesz używać, i musisz wiedzieć, które interfejsy udostępnia. Dokumentacja referencyjna usługi zawiera te informacje.
Pakiety VSPackage udostępniające usługi są nazywane dostawcami usług.
Usługi udostępniane innym pakietom VSPackage są nazywane usługami globalnymi.
Usługi, które są dostępne tylko dla pakietu VSPackage, który je implementuje, lub do dowolnego tworzonego obiektu, są nazywane usługami lokalnymi.
Usługi, które zastępują wbudowane usługi lub usługi udostępniane przez inne pakiety, są nazywane przesłonięciami usług.
Usługi lub przesłonięcia usług są ładowane na żądanie, czyli dostawca usług jest ładowany, gdy usługa, którą udostępnia, jest żądana przez inny pakiet VSPackage.
Aby obsługiwać ładowanie na żądanie, dostawca usług rejestruje swoje usługi globalne w programie Visual Studio. Aby uzyskać więcej informacji, zobacz How to: Provide a Service (Instrukcje: zapewnianie usługi).
Po uzyskaniu usługi użyj elementu QueryInterface (niezarządzanego kodu) lub rzutowania (kodu zarządzanego), aby uzyskać żądany interfejs, na przykład:
Kod zarządzany odwołuje się do usługi według jej typu, natomiast niezarządzany kod odwołuje się do usługi według identyfikatora GUID.
Gdy program Visual Studio ładuje pakiet VSPackage, przekazuje dostawcę usług do pakietu VSPackage w celu udzielenia pakietowi VSPackage dostępu do usług globalnych. Jest to nazywane "siedzenie" pakietem VSPackage.
Pakiety VSPackage mogą być dostawcami usług dla tworzonych obiektów. Na przykład formularz może wysłać żądanie usługi koloru do jej ramki, co może przekazać żądanie do programu Visual Studio.
Obiekty zarządzane, które są głęboko zagnieżdżone lub nie są w ogóle lokacjami, mogą wywoływać GetGlobalService bezpośredni dostęp do usług globalnych.
Korzystanie z polecenia GetGlobalService
Czasami może być konieczne pobranie usługi z okna narzędzi lub kontenera sterowania, który nie został lokacji, lub został on lokacji z dostawcą usług, który nie zna żądanej usługi. Na przykład możesz chcieć zapisać dane w dzienniku aktywności z poziomu kontrolki. Aby uzyskać więcej informacji na temat tych i innych scenariuszy, zobacz How to: Troubleshoot Services (Instrukcje: rozwiązywanie problemów z usługami).
Większość usług programu Visual Studio można uzyskać, wywołując metodę statyczną GetGlobalService .
GetGlobalService korzysta z buforowanego dostawcy usług, który jest inicjowany po raz pierwszy za każdym razem, gdy pakiet VSPackage pochodzi z pakietu jest lokacji. Musisz zagwarantować, że ten warunek jest spełniony lub być przygotowany do obsługi usługi o wartości null.
GetGlobalService Na szczęście działa poprawnie przez większość czasu.
Jeśli pakiet VSPackage udostępnia usługę znaną tylko innemu pakietowi VSPackage, pakiet VSPackage żądający usługi jest lokacji przed załadowaniem pakietu VSPackage dostarczającego usługę.
Jeśli okno narzędzia zostanie utworzone przez pakiet VSPackage, pakiet VSPackage zostanie utworzony przed utworzeniem okna narzędzia.
Jeśli kontener sterowania jest hostowany przez okno narzędzi utworzone przez pakiet VSPackage, pakiet VSPackage jest lokacji przed utworzeniem kontenera sterowania.
Aby uzyskać usługę z poziomu okna narzędzi lub kontenera sterowania
Wstaw ten kod w konstruktorze, oknie narzędzi lub kontenerze sterowania:
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog; if (log == null) return;
Ten kod uzyskuje usługę SVsActivityLog i rzutuje ją do interfejsu IVsActivityLog, który może służyć do zapisywania w dzienniku aktywności. Przykład można znaleźć w temacie How to: Use the Activity Log (Instrukcje: używanie dziennika aktywności).