在特定于 Visual C# 或 Visual Basic 项目的 VSLangProj 和 VSLangProj80 中定义了环境事件。 VSLangProjWebReferencesEvents 是 Visual Studio 2005 中的新类型。 在 Visual Basic 或 Visual C# 项目中添加或移除 Web 引用,或修改该引用的属性时,便会引发该事件。
此示例通过 Visual C# 来使用 VSLangProjWebReferencesEvents 属性为特定项目连接事件处理方法。
提示
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 这些过程是在“常规开发设置”处于活动状态时开发的。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置。
使用 Visual C# 处理与 Web 引用相关的事件
- 在 Visual C# 中创建 Visual Studio 外接程序项目。 
- 在**“项目”菜单上,依次单击“添加引用”、“.NET”选项卡,选择第一个 VSLangProj 和 VSLangProj80,然后单击“确定”**。 
- 在 Connect.cs 文件的顶部添加 using VSLangProj; 和 using VSLangProj80;。 
- 在 Connect 类中,初始化一个变量以处理 VSLangProjWebReferencesEvents 对象。 - private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj80.VSLangProjWebReferencesEvents webRefEvents;- 在此示例中,变量名为 webRefEvents。 - 自动化模型中的其他对象与特定于项目的其他类型的事件相关。 例如,在向 Imports 集合添加导入或从中移除导入时会引发 ImportsEvents。 BuildManagerEvents 应用于根据自定义工具的输出生成的临时程序集的相关事件。 有关 BuildManager 对象的更多信息,请参见 BuildManager 对象介绍。 有关特定于项目类型的事件的完整列表,请参见 事件对象(特定于项目的类型)。 有关通用自动化事件的列表,请参见 自动化事件对象。 
- 将下面的方法调用添加到 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 方法的自动化模型中检索事件对象。 - 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 reference> 替换为实际 Web 服务的 URL。 - 运行此外接程序时,此步骤会导致 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 自动化功能来响应 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 类的代码。 有关如何运行外接程序的信息,请参见如何:使用外接程序管理器控制外接程序。