共用方式為


HOW TO:回應 Web 參考事件 (Visual C#)

VSLangProjVSLangProj80 中定義的環境事件,是 Visual C# 或 Visual Basic 專案特有的事件。VSLangProjWebReferencesEvents 是 Visual Studio 2005 中的新型別。在將 Web 參考加入至 Visual Basic 或 Visual C# 專案,或從這些專案中移除 Web 參考,或當 Web 參考的屬性在這些專案中有所修改時,便會引發這個事件。

這個範例會使用 VSLangProjWebReferencesEvents 屬性,利用 Visual C# 連接特定專案的事件處理方法。

注意事項注意事項

根據您目前使用的設定或版本,您所看到的對話方塊與功能表指令可能會與 [說明] 中描述的不同。使用 [一般開發設定] 開發了這些程序。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定

若要使用 Visual C# 處理與 Web 參考相關的事件

  1. 在 Visual C# 中建立 Visual Studio 增益集專案。

  2. 在 [專案] 功能表上按一下 [加入參考],再按一下 [.NET] 索引標籤,選取第一個 [VSLangProj] 和 [VSLangProj80],然後按一下 [確定]。

  3. 將 using VSLangProj; 和 using VSLangProj80; 加入至 Connect.cs 檔案的最上方。

  4. 在 Connect 類別中初始化變數,以處理 VSLangProjWebReferencesEvents 物件。

    private DTE2 _applicationObject;
    private AddIn _addInInstance;
    private VSLangProj80.VSLangProjWebReferencesEvents webRefEvents;
    

    在這個範例中,變數的名稱為 webRefEvents。

    Automation 模型中的其他物件則是與特定專案中其他類型的事件相關。例如,在 Imports 集合中加入或移除 Import 物件時,會引發 ImportsEvents 事件。BuildManagerEvents 適用於從自訂工具輸出所建置之暫存組件的相關事件。如需 BuildManager 物件的詳細資訊,請參閱 BuildManager 物件簡介;如需因專案類型而異之所有事件的完整清單,請參閱事件物件 (因各種專案類型而異);如需一般 Automation 事件的清單,則請參閱 Automation 事件物件

  5. 將下列方法呼叫加入至 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);
    }
    
  6. 直接在具有下列宣告的 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 物件是這些專案類型所專用的。

  7. 將下列程式碼加入至 WebReferenceEventsSample 方法,藉此將專案轉換成 VSProject2 物件。

    // Get a reference to the VSProject2 object.
    vsproj = (VSProject2)proj.Object;
    
  8. 從 WebReferenceEventsSample 方法中的 Automation 模式擷取事件物件。

    webRefEvents = vsproj.Events2.VSLangProjWebReferencesEvents;
    
  9. 在 WebReferenceEventsSample 方法中連接事件處理常式。

    webRefEvents.OnAfterWebReferenceAdded += new
     _dispVSLangProjWebReferencesEvents_OnAfterWebReferenceAddedEventHandler
    (webRefEvents_OnAfterWebReferenceAdded);
    webRefEvents.OnBeforeWebReferenceRemoved += new
    _dispVSLangProjWebReferencesEvents_OnBeforeWebReferenceRemovedEventHandler
    (webRefEvents_OnBeforeWebReferenceRemoved);
    webRefEvents.OnWebReferenceChanged += new
     _dispVSLangProjWebReferencesEvents_OnWebReferenceChangedEventHandler
    (webRefEvents_OnWebReferenceChanged);
    
  10. 在 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 事件。

  11. 在 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);
    }
    
  12. 最後,為了避免 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);
        }
    }
    

    完整的程式碼會列在本主題的<範例>一節中。

  13. 若要建置增益集,請按一下 [建置] 功能表上的 [建置方案]。

  14. 在 Visual Studio 整合式開發環境 (IDE) 中開啟 Visual C# 或 Visual Basic 專案。

  15. 按一下 [工具] 功能表上的 [增益集管理員],然後從 [增益集管理員] 對話方塊中選取增益集。按一下 [確定],執行您的增益集。

若要測試 VSLangProjWebReferencesEvents 事件處理

  1. 當您執行增益集時,會引發一次 OnAfterWebReferenceAdded 事件,因為範例是以程式設計方式將參考加入至 Web 服務。

  2. 若要測試 OnWebReferenceChanged 事件:

    • 展開 [方案總管] 中的 [Web 參考] 資料夾。

    • 選取 Web 服務並以滑鼠右鍵按一下該服務。

    • 從下拉式功能表中選取 [屬性]。

    • 在 [屬性] 視窗中,從 [URL 行為] 下拉式方塊選取 [靜態],將 URL 行為從動態變更為靜態。

  3. 若要測試 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 類別的程式碼。如需如何執行增益集的詳細資訊,請參閱 HOW TO:使用增益集管理員來控制增益集

請參閱

工作

HOW TO:回應 Web 參考事件 (Visual Basic)

其他資源

回應 Automation 事件

回應事件 (Visual Basic 和 Visual C# 專案)