Практическое руководство. Отклик на события веб-ссылок (Visual C#)
События среды, определенные в VSLangProj и VSLangProj80, относятся к проектам Visual C# и Visual Basic. В VSLangProjWebReferencesEvents представлен новый тип — Visual Studio 2005. Это событие возникает при добавлении или удалении веб-ссылки либо изменении ее свойств в проекте Visual Basic или Visual C#.
В данном примере показано соединение методов обработки событий для конкретного проекта с помощью свойства VSLangProjWebReferencesEvents в Visual C#.
Примечание
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров.Дополнительные сведения см. в разделе Работа с параметрами.
Обработка событий, связанных с веб-ссылками, с помощью языка Visual C#
Создайте проект надстройки Visual Studio в Visual C#.
В меню Проект щелкните Добавить ссылку, перейдите на вкладку .NET выберите первый VSLangProj и VSLangProj80, затем нажмите кнопку ОК.
Добавьте using VSLangProj; и using VSLangProj80; в начало файла Connect.cs.
В классе Connect инициализируйте одну переменную для обработки объекта VSLangProjWebReferencesEvents.
private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj80.VSLangProjWebReferencesEvents webRefEvents;
В этом примере переменная называется webRefEvents.
Другие объекты в модели автоматизации относятся к другим типам событий проекта. Например, ImportsEvents инициируется при добавлении или удалении импорта из коллекции Imports. 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); }
Добавьте объявление метода 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 относится только к этим типам проектов.
Приведите проект к объекту VSProject2, добавив следующий код в метод WebReferenceEventsSample.
// 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 добавьте в проект ссылку на веб-службу.
// 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 происходит при запуске надстройки.
Добавьте процедуры для каждого события, связанного с объектом событий, после метода 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 C# или Visual Basic в интегрированной среде разработки (IDE) Visual Studio.
В меню Свойства щелкните Диспетчер надстроек и в диалоговом окне Диспетчер надстроек выберите надстройку. Нажмите ОК для выполнения надстройки.
Для тестирования обработки событий VSLangProjWebReferencesEvents
Событие OnAfterWebReferenceAdded возникает после запуска надстройки, поскольку пример программно добавляет ссылку в веб-службу.
Для тестирования события OnWebReferenceChanged:
В обозревателе решений откройте папку Веб-ссылки.
Выберите веб-службу и щелкните ее правой кнопкой мыши.
В раскрывающемся меню выберите Свойства.
В окне Свойства замените значение свойства Поведение URL с динамического на статическое, выбрав Статическое.
Для тестирования события 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)