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


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

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

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

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

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

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

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

  2. Добавьте Imports VSLangProj в начало файла Connect.vb.

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

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

    Public Class Connect
        Implements IDTExtensibility2
        Dim _applicationObject As DTE2
        Dim _addInInstance As AddIn
        ' Handle Reference events.
        Public WithEvents refEvents As VSLangProj.ReferencesEvents
        Private outputWinPane As OutputWindowPane
    

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

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

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

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

        Dim outputWindow As OutputWindow
        outputWindow = CType(_applicationObject.Windows.Item _
        (Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow)
        outputWinPane = outputWindow.OutputWindowPanes.Add_
        ("Reference Event Information ")
    
  7. Также, в методе OnConnection извлеките объекты событий из модели автоматизации.

    refEvents = CType(events.GetObject("CSharpReferencesEvents"),_
     ReferencesEvents)
    

    В Visual Studio автоматически подключается обработчик метода, поскольку объявление переменной объекта использует обработчик WithEvents (Visual Basic).

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

  8. Добавьте процедуры для каждого события, связанного с объектом событий.Например, для обработки события, возникающего при добавлении ссылки, можно использовать следующее:

    Sub ReferenceAdded(ByVal addedRef As VSLangProj.Reference)_
        Handles refEvents.ReferenceAdded
        outputWinPane.OutputString_
        ("ReferencesEvents.ReferenceAdded" & ControlChars.Lf)
        outputWinPane.OutputString("The reference to " _
        & addedRef.Name & " was added." & ControlChars.Lf)
    End Sub
    

    В случае с ReferencesEvents потребуются события, определенные для ReferenceAdded, ReferenceRemoved, ReferenceChanged, как показано в полном примере далее.

  9. И наконец, чтобы не допустить замедление системы средой Visual Studio вследствие постоянного отслеживания событий, связанных с окнами после закрытия надстройки, отключите обработку событий.В Visual Basic для этого следует установить для обработчика событий значение Nothing.

    Public Sub OnDisconnection(ByVal RemoveMode As_
     Extensibility.ext_DisconnectMode, ByRef custom As System.Array)_
     Implements Extensibility.IDTExtensibility2.OnDisconnection
        refEvents = Nothing
    End Sub
    

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

Пример

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

Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj

Public Class Connect
    Implements IDTExtensibility2
    Dim _applicationObject As DTE2
    Dim _addInInstance As AddIn
    ' Handle Reference events.
    Public WithEvents refEvents As VSLangProj.ReferencesEvents
    Private outputWinPane As OutputWindowPane
Public Sub OnBeginShutdown(ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnBeginShutdown
End Sub

Public Sub OnAddInsUpdate(ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
End Sub

Public Sub OnStartupComplete(ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnStartupComplete
End Sub

Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnDisconnection
    ' Turns off reference event handling when the add-in shuts down.
    refEvents = Nothing
End Sub

Public Sub OnConnection(ByVal application As Object, _
 ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef _
 custom As System.Array) Implements _
 Extensibility.IDTExtensibility2.OnConnection

    _applicationObject = CType(application, EnvDTE80.DTE2)
    _addInInstance = CType(addInInst, EnvDTE.AddIn)

    Dim events As EnvDTE80.Events2
    events = CType(_applicationObject.Events, Events2)
    ' Send event messages to the Output window.
    Dim outputWindow As OutputWindow
    outputWindow = CType(_applicationObject.Windows.Item _
    (Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow)
    outputWinPane = outputWindow.OutputWindowPanes.Add _
    ("Reference Event Information ")

    ' Retrieve the event objects from the automation model.
    ' Visual Basic automatically connects the method handler since 
    ' the object variable declaration uses the 'WithEvents' handler.
    refEvents = CType(events.GetObject("CSharpReferencesEvents"), _
    ReferencesEvents)
End Sub
    ' Handle all of the various reference-related events.
    Sub ReferenceRemoved(ByVal removedRef As VSLangProj.Reference) _
    Handles refEvents.ReferenceRemoved
    outputWinPane.OutputString("ReferencesEvents.ReferenceRemoved" _
    & ControlChars.Lf)
    outputWinPane.OutputString("The reference to " & removedRef.Name _
    & " was removed." & ControlChars.Lf)
End Sub

Sub ReferenceChanged(ByVal changedRef As VSLangProj.Reference) _
    Handles refEvents.ReferenceChanged
    outputWinPane.OutputString("ReferencesEvents.ReferenceChanged" _
    & ControlChars.Lf)
    outputWinPane.OutputString("The reference to " & changedRef.Name _
    & " was changed." & ControlChars.Lf)
End Sub
Sub ReferenceAdded(ByVal addedRef As VSLangProj.Reference) _
    Handles refEvents.ReferenceAdded
    outputWinPane.OutputString("ReferencesEvents.ReferenceAdded" _
    & ControlChars.Lf)
    outputWinPane.OutputString("The reference to " & addedRef.Name _
    & " was added." & ControlChars.Lf)
End Sub

End Class

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

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

См. также

Задачи

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

Ссылки

Оператор Imports (пространство имен .NET и тип)

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

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

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