方法 : Web 参照イベントを処理する (Visual C#)
VSLangProj および VSLangProj80 で定義された環境イベントは、Visual C# プロジェクトまたは Visual Basic プロジェクトに固有です。VSLangProjWebReferencesEvents は、Visual Studio 2005 の新しい型です。このイベントは、Visual Basic プロジェクトまたは Visual C# プロジェクトにおいて、Web 参照が追加または削除されたとき、あるいはそのプロパティが変更されたときに発生します。
ここでは、Visual C# で VSLangProjWebReferencesEvents プロパティを使用して、特定のプロジェクトのイベント処理メソッドを関連付けます。
[!メモ]
実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。
Visual C# を使用して Web 参照に関連したイベントを処理するには
Visual C# で Visual Studio のアドイン プロジェクトを作成します。
[プロジェクト] メニューの [参照の追加] をクリックし、[.NET] タブをクリックします。次に、最初の VSLangProj および VSLangProj80 を選択して、[OK] をクリックします。
Connect.cs ファイルの先頭に using VSLangProj; および using VSLangProj80; を追加します。
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 の統合開発環境 (IDE: Integrated Development Environment) で開かれることが要求されます。つまり、プロジェクトは、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 のプロジェクトを開きます。
[ツール] メニューの [アドイン マネージャー] をクリックし、[アドイン マネージャー] ダイアログ ボックスからアドインを選択します。[OK] をクリックしてアドインを実行します。
VSLangProjWebReferencesEvents のイベント処理をテストするには
この例では、Web サービスに対する参照をプログラムから追加しているため、OnAfterWebReferenceAdded イベントは、アドインの実行時に発生します。
OnWebReferenceChanged イベントをテストするには
ソリューション エクスプローラーで [Web References] フォルダーを展開します。
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 クラスのコードを例のコードで置き換えます。アドインの実行方法については、「方法: アドイン マネージャーを使用してアドインを制御する」を参照してください。
参照
処理手順
方法 : Web 参照イベントを処理する (Visual Basic)