Udostępnij za pośrednictwem


Uzyskiwanie usługi

Aby uzyskać dostęp do różnych funkcji, często trzeba uzyskać dostęp do usług programu Visual Studio. Ogólnie rzecz biorąc, usługa Visual Studio udostępnia co najmniej jeden interfejs, którego można użyć. Większość usług można uzyskać z pakietu VSPackage.

Każdy pakiet VSPackage, który pochodzi z Package i który został poprawnie lokacji, może poprosić o dowolną usługę globalną. Package Ponieważ klasa implementuje IServiceProviderelement , każdy pakiet VSPackage pochodzący z Package programu jest również dostawcą usług.

Gdy program Visual Studio ładuje obiekt Package, przekazuje IServiceProvider obiekt do SetSite metody podczas inicjowania. Jest to nazywane siedzenie pakietu VSPackage. Klasa Package opakowuje tego dostawcę usług i udostępnia metodę pobierania GetService usług.

Pobieranie usługi z zainicjowanego pakietu VSPackage

  1. Każde rozszerzenie programu Visual Studio rozpoczyna się od projektu wdrażania VSIX, który będzie zawierać zasoby rozszerzenia. Utwórz projekt VSIX programu Visual Studio o nazwie GetServiceExtension. Szablon projektu VSIX można znaleźć w oknie dialogowym Nowy projekt , wyszukując frazę "vsix".

  2. Teraz dodaj niestandardowy szablon elementu polecenia o nazwie GetServiceCommand. W oknie dialogowym Dodawanie nowego elementu przejdź do pozycji Visual C#>Rozszerzalność i wybierz pozycję Polecenie niestandardowe. W polu Nazwa w dolnej części okna zmień nazwę pliku polecenia na GetServiceCommand.cs. Aby uzyskać więcej informacji na temat tworzenia polecenia niestandardowego, utwórz rozszerzenie za pomocą polecenia menu

  3. W pliku GetServiceCommand.cs usuń treść MenuItemCommand metody i dodaj następujący kod:

    IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (activityLog == null) return;
    System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    
    

    Ten kod pobiera usługę SVsActivityLog i rzutuje ją do IVsActivityLog interfejsu, 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).

  4. Skompiluj projekt i rozpocznij debugowanie. Zostanie wyświetlone wystąpienie eksperymentalne.

  5. W menu Narzędzia wystąpienia eksperymentalnego znajdź przycisk Wywołaj polecenie GetServiceCommand. Po kliknięciu tego przycisku powinno zostać wyświetlone okno komunikatu z komunikatem Found the activity log service (Znaleziono usługę dziennika aktywności).

Pobieranie usługi z okna narzędzi lub kontenera sterowania

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.

Metoda statyczna GetGlobalService opiera się na buforowanym dostawcy usług, który jest inicjowany po raz pierwszy po utworzeniu pakietu VSPackage pochodzącego z Package programu jest lokacją.

Ponieważ konstruktor VSPackage jest wywoływany przed lokacją pakietu VSPackage, usługi globalne są zwykle niedostępne z poziomu konstruktora VSPackage. Zobacz Instrukcje: rozwiązywanie problemów z usługami , aby uzyskać obejście problemu.

Oto przykład sposobu pobierania usługi w oknie narzędzi lub innego elementu innego niż VSPackage.

IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

Pobieranie usługi z obiektu DTE

Możesz również pobrać usługi z DTEClass obiektu. Należy jednak pobrać obiekt DTE jako usługę z pakietu VSPackage lub wywołując metodę statyczną GetGlobalService .

Obiekt DTE implementuje IServiceProviderelement , którego można użyć do wykonywania zapytań dotyczących usługi przy użyciu polecenia GetService.

Oto jak uzyskać usługę z obiektu 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.");
    }
}