Поделиться через


Практическое руководство. Отклик на события в определенном проекте (Visual C#)

Объекты модели автоматизации можно использовать для реагирования на события, происходящие в интегрированной среде разработки Visual Studio.События среды, определенные в VSLangProj и VSLangProj80, относятся к проектам Visual C# и Visual Basic.Например, ImportsEvents инициируется при добавлении или удалении импорта из проекта Visual Basic.

В этом примере Visual C# используется для добавления обработчика событий ReferencesEvents, связанного с типом проекта, в проект надстройки.События ReferencesEvents порождаются при изменении, добавлении и удалении ссылок в проектах Visual C# и Visual Basic.

ПримечаниеПримечание

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить параметры, в меню Сервис выберите команду Импорт и экспорт параметров.Дополнительные сведения см. в разделе Параметры Visual Studio.

Обработка событий, связанных с ссылками, с помощью языка Visual C#

  1. Создайте проект надстройки Visual Studio в Visual C#.

  2. Добавьте using VSLangProj; в начало файла Connect.cs.

  3. В меню Проект щелкните Добавить ссылку, перейдите на вкладку .NET выберите первый VSLangProj и нажмите кнопку ОК.

  4. В классе Connect инициализируйте одну переменную для обработки объекта ReferencesEvents, а другую – для обработки OutputWindowPane.

        private DTE2 _applicationObject;
        private AddIn _addInInstance;
        private VSLangProj.ReferencesEvents refEvents;
        private OutputWindowPane outputWinPane;
    

    В этом примере переменная называется refEvents.

    Другие объекты в модели автоматизации относятся к другим типам событий проекта.Например, ImportsEvents инициируется при добавлении или удалении импорта из коллекции Imports.BuildManagerEvents применяется к событиям, связанным с временными сборками, построенными на основе выходных файлов пользовательских средств.Дополнительные сведения об объекте BuildManager см. в разделе Знакомство с объектом BuildManager.Полный список событий, специфических для типов проектов, см. в разделе Объекты событий (специфические для типов проектов), а список общих событий автоматизации содержится в разделе Объекты событий автоматизации.

  5. В методе OnConnection инициализируйте переменную для перехвата событий.В этом примере переменная называется events.

    EnvDTE80.Events2 events = 
    (EnvDTE80.Events2)_applicationObject.Events;
    
  6. В методе OnConnection инициализируйте переменную OutputWindow.

    OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item
    (Constants.vsWindowKindOutput).Object;
    outputWinPane = outputWindow.OutputWindowPanes.Add
    ("ReferencesEvents Event Information");
    
  7. Также, в методе OnConnection извлеките объекты событий из модели автоматизации.

    refEvents = 
    (VSLangProj.ReferencesEvents)events.GetObject
    ("CSharpReferencesEvents");
    

    В этом примере ReferencesEvents относятся к проектам Visual C#.Чтобы обеспечить реакцию на события, относящиеся к Visual Basic, замените строку CSharpReferencesEvents строкой VBReferencesEvents.Для получения дополнительных сведений о способах определения строк для событий, специфических для различных типов проектов, см. раздел Объекты событий (специфические для типов проектов).

  8. Подключитесь к каждому делегату объектов событий, полученных на шаге 3, используя оператор "+=".Например, для подключения делегатов, полученных событием ReferenceAdded, можно использовать:

    refEvents.ReferenceAdded += new 
    _dispReferencesEvents_ReferenceAddedEventHandler
    (this.ReferenceAdded);
    
  9. Добавьте процедуры для каждого события, связанного с объектом событий.Например, для обработки события, возникающего при добавлении ссылки, можно использовать следующее:

    public void ReferenceAdded( VSLangProj.Reference addedRef ) 
    { 
        outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" 
    + "\n" ); 
        outputWinPane.OutputString( "The reference to " + addedRef.Name
     + " was added." + "\n" ); 
    }
    

    В случае с ReferencesEvents события должны быть определены для следующего:

    и

    Эти события включены в полном примере далее.

  10. И наконец, чтобы не допустить замедление системы средой Visual Studio вследствие постоянного отслеживания событий, связанных с окнами после закрытия надстройки, отключите обработку событий.В Visual C# для этого служит оператор "-=".Например, для отключения обработки событий ReferenceAdded можно использовать:

    refEvents.ReferenceAdded -= new
     _dispReferencesEvents_ReferenceAddedEventHandler
    (this.ReferenceAdded);
    

    Это обеспечивает отключение обработчика событий при завершении работы надстройки или при завершении работы интегрированной среды разработки (даже если надстройка продолжает работать).При завершении работы интегрированной среды разработки все запущенные надстройки также выключаются.

Пример

В следующем примере показана простая надстройка Visual Studio, которая демонстрирует перехват и обработку событий ссылок Visual C# в Visual Studio.Каждый раз, когда происходит событие ссылки, в окно Вывод отправляется уведомление.

using System;
using Microsoft.VisualStudio.CommandBars;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using VSLangProj;

public Connect()
  {
  }
  public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
  {
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;

    // Retrieve the event objects from the automation model.
    EnvDTE80.Events2 events = 
(EnvDTE80.Events2)_applicationObject.Events;
    // Send event messages to the Output window.
    OutputWindow outputWindow =
 (OutputWindow)_applicationObject.Windows.Item
(Constants.vsWindowKindOutput).Object;
    outputWinPane = 
outputWindow.OutputWindowPanes.Add
("ReferencesEvents Event Information");

    // Retrieve the event objects from the automation model.
    refEvents = (VSLangProj.ReferencesEvents)
events.GetObject("CSharpReferencesEvents");

    // Connect to each delegate exposed from each object 
    // retrieved above.
    refEvents.ReferenceAdded += new
 _dispReferencesEvents_ReferenceAddedEventHandler
(this.ReferenceAdded);
    refEvents.ReferenceChanged += new
 _dispReferencesEvents_ReferenceChangedEventHandler
(this.ReferenceChanged);
    refEvents.ReferenceRemoved += new
 _dispReferencesEvents_ReferenceRemovedEventHandler
(this.ReferenceRemoved); 
  }

  public void OnDisconnection(Extensibility.ext_DisconnectMode
 disconnectMode, ref System.Array custom)
  {
    // If the delegate handlers have been connected, then 
    // disconnect them here. 
    // If you do not do this, the handlers may still 
    // fire because they have not been garbage collected.
    if (refEvents != null)
    {
        refEvents.ReferenceAdded -= new
 _dispReferencesEvents_ReferenceAddedEventHandler
(this.ReferenceAdded);
        refEvents.ReferenceChanged -= new
 _dispReferencesEvents_ReferenceChangedEventHandler
(this.ReferenceChanged);
        refEvents.ReferenceRemoved -= new
 _dispReferencesEvents_ReferenceRemovedEventHandler
(this.ReferenceRemoved); 
    }
  }

  // References related events.
  public void ReferenceRemoved( VSLangProj.Reference removedRef ) 
  { 
    outputWinPane.OutputString( "ReferencesEvents.ReferenceRemoved"
 + "\n" ); 
    outputWinPane.OutputString( "The reference to " + removedRef.Name
 + " was removed." + "\n" ); 
  } 

  public void ReferenceChanged( VSLangProj.Reference changedRef ) 
  { 
    outputWinPane.OutputString( "ReferencesEvents.ReferenceChanged" 
+ "\n" ); 
    outputWinPane.OutputString( "The reference to " + changedRef.Name 
+ " was changed." + "\n" ); 
  } 
        
  public void ReferenceAdded( VSLangProj.Reference addedRef ) 
  { 
    outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" +
 "\n" ); 
    outputWinPane.OutputString( "The reference to " + addedRef.Name 
+ " was added." + "\n" ); 
  } 
  public void OnAddInsUpdate(ref System.Array custom)
  {
  }
  public void OnStartupComplete(ref System.Array custom)
  {
  }
  public void OnBeginShutdown(ref System.Array custom)
  {
  }
  private DTE2 _applicationObject;
  private AddIn _addInInstance;
  private VSLangProj.ReferencesEvents refEvents;
  private OutputWindowPane outputWinPane;
  }}

Компиляция кода

Для компиляции этого кода создайте новый проект надстройки Visual Studio в Visual C# и замените код класса Connect кодом из этого примера.Сведения о запуске надстройки см. в разделе Практическое руководство. Управление надстройками с помощью диспетчера надстроек.

См. также

Задачи

Практическое руководство. Отклик на события в определенном проекте (Visual Basic)

Ссылки

Оператор += (справочник по C#)

Оператор -= (Справочник по C#)

Другие ресурсы

Реакция на события автоматизации

Отклик на события (проекты Visual Basic и Visual C#)