Практическое руководство. Отклик на события в определенном проекте (Visual Basic)
Объекты модели автоматизации можно использовать для реагирования на события, происходящие в интегрированной среде разработки Visual Studio. События среды, определенные в VSLangProj и VSLangProj80, относятся к проектам Visual C# и Visual Basic. Например, ImportsEvents инициируется при добавлении или удалении импорта из коллекции Imports.
В этом примере Visual Basic используется для добавления обработчика событий ReferencesEvents, связанного с типом проекта, в проект надстройки. События ReferencesEvents порождаются при изменении, добавлении и удалении ссылок в проектах Visual C# и Visual Basic.
Примечание
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров.Дополнительные сведения см. в разделе Работа с параметрами.
Обработка событий, связанных с ссылками, с помощью языка Visual Basic
Создайте проект надстройки Visual Studio в Visual Basic.
Добавьте Imports VSLangProj в начало файла Connect.vb.
В меню Проект щелкните Добавить ссылку, перейдите на вкладку .NET выберите первый VSLangProj и нажмите кнопку ОК.
В классе 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. Полный список событий, специфических для типов проектов, см. в разделе Объекты событий (специфические для типов проектов). Список общих событий автоматизации см. в разделе Объекты событий автоматизации.
В методе OnConnection инициализируйте переменную для перехвата событий. В этом примере переменная называется events.
Dim events As EnvDTE80.Events2 events = CType(_applicationObject.Events, Events2)
В методе OnConnection инициализируйте переменную OutputWindow.
Dim outputWindow As OutputWindow outputWindow = CType(_applicationObject.Windows.Item _ (Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow) outputWinPane = outputWindow.OutputWindowPanes.Add_ ("Reference Event Information ")
Также, в методе OnConnection извлеките объекты событий из модели автоматизации.
refEvents = CType(events.GetObject("CSharpReferencesEvents"),_ ReferencesEvents)
В Visual Studio автоматически подключается обработчик метода, поскольку объявление переменной объекта использует обработчик WithEvents (Visual Basic).
В этом примере ReferencesEvents относятся к проектам Visual C#. Чтобы обеспечить реакцию на события, относящиеся к событиям Visual Basic, замените строку CSharpReferencesEvents строкой VBReferencesEvents. Для получения дополнительных сведений о способах определения строк для событий, специфических для различных типов проектов, см. раздел Объекты событий (специфические для типов проектов).
Добавьте процедуры для каждого события, связанного с объектом событий. Например, для обработки события, возникающего при добавлении ссылки, можно использовать следующее:
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, как показано в полном примере далее.
И наконец, чтобы не допустить замедление системы средой 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 и тип)