如何:响应 Web 引用事件 (Visual C#)
在特定于 Visual C# 或 Visual Basic 项目的 VSLangProj 和 VSLangProj80 中定义了环境事件。 VSLangProjWebReferencesEvents 是 Visual Studio 2005 中的新类型。 在 Visual Basic 或 Visual C# 项目中添加或移除 Web 引用,或修改该引用的属性时,便会引发该事件。
此示例通过 Visual C# 来使用 VSLangProjWebReferencesEvents 属性为特定项目连接事件处理方法。
备注
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。这些过程是在“常规开发设置”处于活动状态时开发的。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。
使用 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 类的代码。 有关如何运行外接程序的信息,请参见如何:使用外接程序管理器控制外接程序。