如何:回應 Web 參考事件 (Visual C#)
在 VSLangProj 和 VSLangProj80 中定義的環境事件,是 Visual C# 或 Visual Basic 專案特有的事件。 VSLangProjWebReferencesEvents 是 Visual Studio 2005 中的新型別。 在將 Web 參考加入至 Visual Basic 或 Visual C# 專案,或從這些專案中移除 Web 參考,或當 Web 參考的屬性在這些專案中有所修改時,便會引發這個事件。
這個範例會使用 VSLangProjWebReferencesEvents 屬性,利用 Visual C# 連接特定專案的事件處理方法。
注意事項 |
---|
在下列指示的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置:您所擁有的 Visual Studio 版本和使用的設定決定了這些項目。如需詳細資訊,請參閱Visual Studio 中的自訂開發設定。 |
若要使用 Visual C# 處理與 Web 參考相關的事件
在 Visual C# 中建立 Visual Studio 增益集專案。
在 [專案] 功能表上按一下 [加入參考],再按一下 [.NET] 索引標籤,選取第一個 [VSLangProj] 和 [VSLangProj80],然後按一下 [確定]。
將 using VSLangProj; 和 using VSLangProj80; 加入至 Connect.cs 檔案的最上方。
在 Connect 類別中初始化變數,以處理 VSLangProjWebReferencesEvents 物件。
private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj80.VSLangProjWebReferencesEvents webRefEvents;
在這個範例中,變數的名稱為 webRefEvents。
Automation 模型中的其他物件則是與特定專案中其他類型的事件相關。 例如,在 Imports 集合中加入或移除 Import 物件時,會引發 ImportsEvents 事件。 BuildManagerEvents 適用於從自訂工具輸出所建置之暫存組件的相關事件。 如需 BuildManager 物件的詳細資訊,請參閱 BuildManager 物件簡介; 如需因專案類型而異之所有事件的完整清單,請參閱事件物件 (因各種專案類型而異); 如需一般 Automation 事件的清單,則請參閱 Automation 事件物件。
將下列方法呼叫加入至 OnConnection 方法。
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the WebReferenceEventsSample method. WebReferenceEventsSample (_applicationObject); }
直接在具有下列宣告的 OnConnection 方法的下方,加入 WebReferenceEventsSample 方法宣告。
public void WebReferenceEventsSample(DTE2 dte) { Solution2 soln = (Solution2)_applicationObject.Solution; Project proj; VSProject2 vsproj; String webServiceRef; proj = soln.Projects.Item(1); }
當您執行此範例時,proj = soln.Projects.Item(1); 宣告需要在 Visual Studio 整合式開發環境 (IDE) 中開啟專案。 特別是該專案必須為 Visual Basic 或 Visual C# 專案,因為 VSLangProjWebReferencesEvents 物件是這些專案類型所專用的。
將下列程式碼加入至 WebReferenceEventsSample 方法,藉此將專案轉換成 VSProject2 物件。
// Get a reference to the VSProject2 object. vsproj = (VSProject2)proj.Object;
從 WebReferenceEventsSample 方法中的 Automation 模式擷取事件物件。
webRefEvents = vsproj.Events2.VSLangProjWebReferencesEvents;
在 WebReferenceEventsSample 方法中連接事件處理常式。
webRefEvents.OnAfterWebReferenceAdded += new _dispVSLangProjWebReferencesEvents_OnAfterWebReferenceAddedEventHandler (webRefEvents_OnAfterWebReferenceAdded); webRefEvents.OnBeforeWebReferenceRemoved += new _dispVSLangProjWebReferencesEvents_OnBeforeWebReferenceRemovedEventHandler (webRefEvents_OnBeforeWebReferenceRemoved); webRefEvents.OnWebReferenceChanged += new _dispVSLangProjWebReferencesEvents_OnWebReferenceChangedEventHandler (webRefEvents_OnWebReferenceChanged);
在 WebReferenceEventsSample 方法中,將 Web 服務的參考加入至專案。
// Add a Web reference to the folder. // Replace the "<web reference>" with an actual Web service. MessageBox.Show("Adding a Web reference.", "Information"); webServiceRef = "<web reference>"; vsproj.AddWebReference(webServiceRef);
若要以程式設計方式將 Web 服務的參考加入至專案,您必須以實際 Web 服務的 URL 取代程式碼中的預留位置文字 <web reference>。
當您執行這個增益集時,此步驟會導致引發 OnAfterWebReferenceAdded 事件。
在 WebReferenceEventsSample 方法下方,為與事件物件相關的每個事件加入程序。
void webRefEvents_OnWebReferenceChanged(object pDispatch) { MessageBox.Show("A Web reference was changed."); } void webRefEvents_OnBeforeWebReferenceRemoved(object pDispatch) { MessageBox.Show("A Web reference was removed."); } void webRefEvents_OnAfterWebReferenceAdded(object pDispatch) { MessageBox.Show("A Web reference was added." + pDispatch.Name); }
最後,為了避免 Visual Studio 在您關閉增益集之後繼續監視與視窗相關的事件,因而減慢系統速度,請停用 OnDisconnection 方法中的事件處理。
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref 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 garbage collection has not removed them. if (webRefEvents != null) { webRefEvents.OnAfterWebReferenceAdded -= new _dispVSLangProjWebReferencesEvents _OnAfterWebReferenceAddedEventHandler (webRefEvents_OnAfterWebReferenceAdded); webRefEvents.OnBeforeWebReferenceRemoved -= new _dispVSLangProjWebReferencesEvents _OnBeforeWebReferenceRemovedEventHandler (webRefEvents_OnBeforeWebReferenceRemoved); webRefEvents.OnWebReferenceChanged -= new _dispVSLangProjWebReferencesEvents _OnWebReferenceChangedEventHandler (webRefEvents_OnWebReferenceChanged); } }
完整的程式碼會列在本主題的<範例>一節中。
若要建置增益集,請按一下 [建置] 功能表上的 [建置方案]。
在 Visual Studio 整合式開發環境 (IDE) 中開啟 Visual C# 或 Visual Basic 專案。
按一下 [工具] 功能表上的 [增益集管理員],然後從 [增益集管理員] 對話方塊中選取增益集。 按一下 [確定],執行您的增益集。
若要測試 VSLangProjWebReferencesEvents 事件處理
當您執行增益集時,會引發一次 OnAfterWebReferenceAdded 事件,因為範例是以程式設計方式將參考加入至 Web 服務。
若要測試 OnWebReferenceChanged 事件:
展開 [方案總管] 中的 [Web 參考] 資料夾。
選取 Web 服務並以滑鼠右鍵按一下該服務。
從下拉式功能表中選取 [屬性]。
在 [屬性] 視窗中,從 [URL 行為] 下拉式方塊選取 [靜態],將 URL 行為從動態變更為靜態。
若要測試 OnBeforeWebReferenceRemoved 事件:
選取 Web 服務並以滑鼠右鍵按一下該服務。
從下拉式功能表中選取 [刪除]。
範例
下列範例是基本的 Visual Studio 增益集,示範如何使用 Visual Studio Automation 回應 Web 參考事件。
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
using System.Windows.Forms;
namespace MyAddin
{
public class Connect : Object, IDTExtensibility2
{
public Connect()
{
}
public void OnConnection(object application,
ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
// Call the WebReferenceEventsSample method.
WebReferenceEventsSample(_applicationObject);
}
public void WebReferenceEventsSample(DTE2 dte)
{
try
{
Solution2 soln =
(Solution2)_applicationObject.Solution;
Project proj;
VSProject2 vsproj;
String webServiceRef;
proj = soln.Projects.Item(1);
// Get a reference to the VSProject2 object.
vsproj = (VSProject2)proj.Object;
//Connect Web references events.
webRefEvents =
vsproj.Events2.VSLangProjWebReferencesEvents;
webRefEvents.OnAfterWebReferenceAdded +=new
_dispVSLangProjWebReferencesEvents
_OnAfterWebReferenceAddedEventHandler
(webRefEvents_OnAfterWebReferenceAdded);
webRefEvents.OnBeforeWebReferenceRemoved += new
_dispVSLangProjWebReferencesEvents
_OnBeforeWebReferenceRemovedEventHandler
(webRefEvents_OnBeforeWebReferenceRemoved);
webRefEvents.OnWebReferenceChanged += new
_dispVSLangProjWebReferencesEvents
_OnWebReferenceChangedEventHandler
(webRefEvents_OnWebReferenceChanged);
// Create a Web references folder.
MessageBox.Show("Creating a Web references folder."
, "Information");
vsproj.CreateWebReferencesFolder();
// Add a Web reference to the folder.
// Replace the "<web reference>" with an
// actual Web service URL.
MessageBox.Show("Adding a Web reference."
, "Information");
webServiceRef = "<web reference>";
vsproj.AddWebReference(webServiceRef);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void webRefEvents_OnWebReferenceChanged(object pDispatch)
{
MessageBox.Show("A Web reference was changed.");
}
void webRefEvents_OnBeforeWebReferenceRemoved(object pDispatch)
{
MessageBox.Show("A Web reference was removed.");
}
void webRefEvents_OnAfterWebReferenceAdded(object pDispatch)
{
MessageBox.Show("A Web reference was added.");
}
public void OnDisconnection(ext_DisconnectMode disconnectMode,
ref 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 garbage collection has not removed them.
if (webRefEvents != null)
{
webRefEvents.OnAfterWebReferenceAdded -= new
_dispVSLangProjWebReferencesEvents
_OnAfterWebReferenceAddedEventHandler
(webRefEvents_OnAfterWebReferenceAdded);
webRefEvents.OnBeforeWebReferenceRemoved -= new
_dispVSLangProjWebReferencesEvents
_OnBeforeWebReferenceRemovedEventHandler
(webRefEvents_OnBeforeWebReferenceRemoved);
webRefEvents.OnWebReferenceChanged -= new
_dispVSLangProjWebReferencesEvents
_OnWebReferenceChangedEventHandler
(webRefEvents_OnWebReferenceChanged);
}
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
}
public void OnBeginShutdown(ref Array custom)
{
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
private VSLangProj80.VSLangProjWebReferencesEvents webRefEvents;
}
}
編譯程式碼
若要編譯此程式碼,請在 Visual C# 中建立新的 Visual Studio 增益集專案,並以範例中的程式碼取代 Connect 類別的程式碼。 如需如何執行增益集的詳細資訊,請參閱 如何:使用增益集管理員來控制增益集。