Поделиться через


Практическое руководство. Отклик на события веб-ссылок (Visual C#)

События среды, определенные в VSLangProj и VSLangProj80, относятся к проектам Visual C# и Visual Basic. В VSLangProjWebReferencesEvents представлен новый тип — Visual Studio 2005. Это событие возникает при добавлении или удалении веб-ссылки либо изменении ее свойств в проекте Visual Basic или Visual C#.

В данном примере показано соединение методов обработки событий для конкретного проекта с помощью свойства VSLangProjWebReferencesEvents в Visual C#.

Примечание

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров.Дополнительные сведения см. в разделе Работа с параметрами.

Обработка событий, связанных с веб-ссылками, с помощью языка Visual C#

  1. Создайте проект надстройки Visual Studio в Visual C#.

  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.

    Другие объекты в модели автоматизации относятся к другим типам событий проекта. Например, ImportsEvents инициируется при добавлении или удалении импорта из коллекции Imports. BuildManagerEvents применяется к событиям, связанным с временными сборками, построенными на основе выходных файлов пользовательских средств. Дополнительные сведения об объекте BuildManager см. в разделе Знакомство с объектом BuildManager. Полный список событий, специфических для различных типов проектов, см. в разделе Объекты событий (специфические для типов проектов). Список общих событий автоматизации см. в разделе Объекты событий автоматизации.

  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. Добавьте объявление метода WebReferenceEventsSample сразу после метода OnConnection со следующими объявлениями.

    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 перед запуском этого примера. В частности, проект должен быть проектом Visual Basic или Visual C#, поскольку объект VSLangProjWebReferencesEvents относится только к этим типам проектов.

  7. Приведите проект к объекту VSProject2, добавив следующий код в метод WebReferenceEventsSample.

    // Get a reference to the VSProject2 object.
    vsproj = (VSProject2)proj.Object;
    
  8. В методе WebReferenceEventsSample извлеките объекты событий из модели автоматизации.

    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 добавьте в проект ссылку на веб-службу.

    // 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 reference> в коде потребуется заменить URL-адресом фактической веб-службы.

    Из-за этого событие 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 C# или Visual Basic в интегрированной среде разработки (IDE) Visual Studio.

  15. В меню Свойства щелкните Диспетчер надстроек и в диалоговом окне Диспетчер надстроек выберите надстройку. Нажмите ОК для выполнения надстройки.

Для тестирования обработки событий VSLangProjWebReferencesEvents

  1. Событие OnAfterWebReferenceAdded возникает после запуска надстройки, поскольку пример программно добавляет ссылку в веб-службу.

  2. Для тестирования события OnWebReferenceChanged:

    • В обозревателе решений откройте папку Веб-ссылки.

    • Выберите веб-службу и щелкните ее правой кнопкой мыши.

    • В раскрывающемся меню выберите Свойства.

    • В окне Свойства замените значение свойства Поведение URL с динамического на статическое, выбрав Статическое.

  3. Для тестирования события OnBeforeWebReferenceRemoved:

    • Выберите веб-службу и щелкните ее правой кнопкой мыши.

    • В раскрывающемся меню выберите Удалить.

Пример

Следующий пример представляет собой простую надстройку Visual Studio, которая демонстрирует реагирование на события веб-ссылок при помощи автоматизации 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;
    }
}

Компиляция кода

Для компиляции этого кода создайте новый проект надстройки Visual Studio в Visual C# и замените код класса Connect кодом из этого примера. Сведения о запуске надстройки см. в разделе Практическое руководство. Управление надстройками с помощью диспетчера надстроек.

См. также

Задачи

Практическое руководство. Отклик на события веб-ссылок (Visual Basic)

Другие ресурсы

Реакция на события автоматизации

Отклик на события (проекты Visual Basic и Visual C#)