Cómo: Responder a los eventos de referencias web (Visual C#)
Actualización: noviembre 2007
Los eventos de entorno definidos en VSLangProj y VSLangProj80 son específicos de los proyectos de Visual C#, Visual Basic y Visual J#. VSLangProjWebReferencesEvents es un nuevo tipo en Visual Studio 2005. Se provoca cuando se agrega o se quita una referencia web, o cuando se modifican sus propiedades en un proyecto de Visual Basic, Visual C# o Visual J#.
Este ejemplo utiliza Visual C# para conectar métodos de control de eventos para un proyecto específico por medio de la propiedad VSLangProjWebReferencesEvents.
Nota: |
---|
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de la configuración activa o la edición. Estos procedimientos se han desarrollado con la Configuración de desarrollo general activa. Para cambiar la configuración, elija la opción Importar y exportar configuraciones en el menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio. |
Para controlar eventos relacionados con referencias Web utilizando Visual C#
Cree un proyecto de complemento de Visual Studio en Visual C#.
En el Menú Proyecto, haga clic en Agregar referencia, haga clic en la ficha de .NET, seleccione el primer VSLangProj y VSLangProj80 y haga clic en Aceptar.
Agregue using VSLangProj; y using VSLangProj80; al principio del archivo Connect.cs.
En la clase Connect, inicialice una variable para controlar el objeto VSLangProjWebReferencesEvents.
private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj80.VSLangProjWebReferencesEvents webRefEvents;
En este ejemplo, la variable se llama webRefEvents.
Otros objetos del modelo de automatización están relacionados con otros tipos de eventos específicos del proyecto. Por ejemplo, ImportsEvents se provoca cuando se agrega o se quita una importación en una colección Imports. BuildManagerEvents se aplica a eventos relacionados con ensamblados temporales generados a partir de resultados de herramientas personalizadas. Para obtener más información sobre el objeto BuildManager, vea Introducción al objeto BuildManager. Para ver una lista completa de los eventos específicos de los tipos de proyecto, vea Objetos de evento (específicos para tipos de proyectos). Para obtener una lista de eventos de automatización generales, vea Objetos de eventos de automatización.
Agregue la llamada siguiente al método 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); }
Agregue la declaración del método WebReferenceEventsSample directamente debajo del método OnConnection con las declaraciones siguientes.
public void WebReferenceEventsSample(DTE2 dte) { Solution2 soln = (Solution2)_applicationObject.Solution; Project proj; VSProject2 vsproj; String webServiceRef; proj = soln.Projects.Item(1); }
La declaración proj = soln.Projects.Item(1); requiere que un proyecto esté abierto en el entorno de desarrollo integrado (IDE) de Visual Studio cuando se ejecute este ejemplo. En particular, el proyecto debe ser un proyecto de Visual Basic, Visual C# o Visual J#, porque el objeto VSLangProjWebReferencesEvents es específico a esos tipos de proyecto.
Convierta el proyecto en un objeto VSProject2 agregando el código siguiente al método WebReferenceEventsSample.
// Get a reference to the VSProject2 object. vsproj = (VSProject2)proj.Object;
Recupere los objetos de evento del modelo de automatización en el método WebReferenceEventsSample.
webRefEvents = vsproj.Events2.VSLangProjWebReferencesEvents;
En el método WebReferenceEventsSample, conecte los controladores de eventos.
webRefEvents.OnAfterWebReferenceAdded += new _dispVSLangProjWebReferencesEvents_OnAfterWebReferenceAddedEventHandler (webRefEvents_OnAfterWebReferenceAdded); webRefEvents.OnBeforeWebReferenceRemoved += new _dispVSLangProjWebReferencesEvents_OnBeforeWebReferenceRemovedEventHandler (webRefEvents_OnBeforeWebReferenceRemoved); webRefEvents.OnWebReferenceChanged += new _dispVSLangProjWebReferencesEvents_OnWebReferenceChangedEventHandler (webRefEvents_OnWebReferenceChanged);
En el método WebReferenceEventsSample, agregue al proyecto una referencia a un servicio 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);
Para agregar al proyecto mediante programación una referencia a un servicio Web, debe reemplazar en el código el texto del marcador, <web reference>, por la dirección URL de un servicio Web real.
Este paso hace que se desencadene el evento OnAfterWebReferenceAdded cuando se ejecuta este complemento.
Agregue procedimientos para cada evento relacionado con el objeto de evento debajo del método 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); }
Finalmente, para evitar que Visual Studio ralentice el sistema continuando la supervisión de eventos relacionados con ventanas después de cerrar el complemento, deshabilite el control de eventos en el método 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); } }
El código completo se muestra en la sección Ejemplo de este tema.
Para generar el complemento, haga clic en Generar solución en el menú Generar.
Abra un proyecto de Visual C#, Visual J# o Visual Basic en el entorno de desarrollo integrado (IDE) de Visual Studio.
En el menú Herramientas, haga clic en Administrador de complementos y seleccione el complemento del cuadro de diálogo Administrador de complementos. Haga clic en Aceptar para ejecutar el complemento.
Para probar el control de eventos de VSLangProjWebReferencesEvents
El evento OnAfterWebReferenceAdded se desencadena una vez cuando se ejecuta el complemento, porque el ejemplo agrega mediante programación una referencia a un servicio Web.
Para probar el evento OnWebReferenceChanged:
Expanda la carpeta Referencias Web en el Explorador de soluciones.
Seleccione el servicio Web y haga clic en él con el botón secundario del mouse.
Seleccione Propiedades en el menú desplegable.
En la ventana Propiedades, cambie el comportamiento de la dirección URL de dinámico a estático seleccionando Estático en el cuadro combinado Comportamiento de dirección URL.
Para probar el evento OnBeforeWebReferenceRemoved:
Seleccione el servicio Web y haga clic en él con el botón secundario del mouse.
Seleccione Eliminar en el menú desplegable.
Ejemplo
El ejemplo siguiente es un complemento básico de Visual Studio que muestra cómo responder a eventos de referencias web utilizando la automatización de Visual Studio.
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;
}
}
Compilar el código
Para compilar este código, cree un nuevo proyecto de complemento de Visual Studio en Visual C# y reemplace el código de la clase Connect por el código del ejemplo. Para obtener información sobre cómo ejecutar un complemento, vea Cómo: Controlar complementos con el Administrador de complementos.
Vea también
Tareas
Cómo: Responder a los eventos de referencias web (Visual Basic)