HOW TO:回應在特定專案中的事件 (Visual Basic)
Automation 模型包含可以用來回應 Visual Studio 整合式開發環境 (IDE) 中各種環境事件的物件。 在 VSLangProj 和 VSLangProj80 中定義的環境事件,是 Visual C# 和 Visual Basic 專案特有的事件。 例如,在 Imports 集合中加入或移除 Import 物件時,會引發 ImportsEvents 事件。
這個範例會使用 Visual Basic,將某個專案類型特有的 ReferencesEvents 事件處理常式加入至增益集專案。 當 Visual C# 或 Visual Basic 專案中變更、加入或移除參考時,會引發 ReferencesEvents 事件。
注意事項 |
---|
根據您目前使用的設定或版本,您所看到的對話方塊與功能表指令可能會與 [說明] 中描述的不同。使用 [一般開發設定] 開發了這些程序。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定。 |
若要使用 Visual Basic 處理與參考相關的事件
在 Visual Basic 中建立 Visual Studio 增益集專案。
將 Imports VSLangProj 加入至 Connect.vb 檔案的最上方。
在 [專案] 功能表上按一下 [加入參考],再按一下 [.NET] 索引標籤,選取第一個 [VSLangProj],然後再按 [確定]。
在 Connect 類別 (Class) 中,初始化一個處理 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。
Automation 模型中的其他物件則是與特定專案中其他類型的事件相關。 例如,在 Imports 集合中加入或移除 Import 物件時,會引發 ImportsEvents 事件。 BuildManagerEvents 適用於從自訂工具輸出所建置之暫存組件的相關事件。 如需 BuildManager 物件的詳細資訊,請參閱 BuildManager 物件簡介; 如需因專案類型而異之所有事件的完整清單,請參閱事件物件 (因各種專案類型而異); 如需一般 Automation 事件的清單,則請參閱 Automation 事件物件。
在 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 方法中,從 Automation 模型中擷取事件物件 (Event Object)。
refEvents = CType(events.GetObject("CSharpReferencesEvents"),_ ReferencesEvents)
因為物件的變數宣告使用了 WithEvents (Visual Basic) 處理常式,所以 Visual Studio 會自動連接方法處理常式。
在這個範例中,ReferencesEvents 是 Visual C# 專案特有的事件。 若要回應 Visual Basic 特有的事件,則請以 VBReferencesEvents 取代 CSharpReferencesEvents 字串。 如需如何判斷因不同專案類型而異之事件應使用何種字串的詳細資訊,請參閱事件物件 (因各種專案類型而異)。
為事件物件的每個相關事件加入程序。 例如,若要處理在加入參考時發生的事件,請使用下列程式碼:
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
這麼做的話,不論是關閉增益集,或是當增益集仍在執行時關閉 IDE,都會關閉事件處理功能。 當 IDE 關閉時,所有執行中的增益集會先自動關閉。
範例
下列是基本 Visual Studio 增益集的範例,在此範例中會示範如何在 Visual Studio 中攔截及處理 Visual C# 參考事件。 每當發生參考事件時,就會傳送通知訊息至 [輸出] 視窗。
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 Basic 中建立新的 Visual Studio 增益集專案,並以範例中的程式碼取代 Connect 類別的程式碼。 如需如何執行增益集的詳細資訊,請參閱 HOW TO:使用增益集管理員來控制增益集。
請參閱
工作
HOW TO:回應在特定專案中的事件 (Visual C#)