方法 : 特定のプロジェクトのイベントに応答する (Visual C#)
更新 : 2007 年 11 月
オートメーション モデルには、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) で環境イベントへの応答に使用できるオブジェクトが含まれています。VSLangProj および VSLangProj80 で定義された環境イベントは、Visual C#、Visual Basic、および Visual J# の各プロジェクトに固有です。たとえば、ImportsEvents は、Visual Basic プロジェクトに対しインポートの追加または削除を行ったときに発生します。
この例では、Visual C# を使用し、プロジェクトの種類に固有の ReferencesEvents イベント ハンドラをアドイン プロジェクトに追加します。ReferencesEvents は、Visual C#、Visual Basic、または Visual J# のプロジェクトで参照を変更、追加、または削除したときに発生します。
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
Visual C# を使用して参照に関連するイベントを処理するには
Visual C# で Visual Studio のアドイン プロジェクトを作成します。
Connect.cs ファイルの先頭に using VSLangProj; を追加します。
[プロジェクト] メニューの [参照の追加] をクリックし、[.NET] タブをクリックします。最初の [VSLangProj] を選択し、[OK] をクリックします。
Connect クラスで、ReferencesEvents オブジェクトを処理する変数および OutputWindowPane を処理する別の変数を初期化します。
private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj.ReferencesEvents refEvents;private OutputWindowPane outputWinPane;
この例では、変数の名前は refEvents です。
オートメーション モデル内の他のオブジェクトは、プロジェクト固有の他の種類のイベントに関連しています。たとえば、ImportsEvents は、Imports コレクションに対してインポートの追加または削除を行ったときに発生します。BuildManagerEvents は、カスタム ツールの出力で作成された一時的なアセンブリに関連するイベントに適用されます。BuildManager オブジェクトの詳細については、「BuildManager オブジェクトの概要」を参照してください。プロジェクトの種類に固有のイベントの一覧については、「イベント オブジェクト (プロジェクトの種類に固有)」を参照してください。また、一般的なオートメーション イベントの一覧については、「オートメーション イベント オブジェクト」を参照してください。
OnConnection メソッドでは、変数を初期化してイベントを受け取ります。この例では、変数は events と呼ばれます。
EnvDTE80.Events2 events = (EnvDTE80.Events2)_applicationObject.Events;
OnConnection メソッドで、OutputWindow 変数を初期化します。
OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item (Constants.vsWindowKindOutput).Object; outputWinPane = outputWindow.OutputWindowPanes.Add ("ReferencesEvents Event Information");
また、OnConnection メソッドでは、オートメーション モデルからイベント オブジェクトを取得します。
refEvents = (VSLangProj.ReferencesEvents)events.GetObject ("CSharpReferencesEvents");
この例では、ReferencesEvents は Visual C# プロジェクトに固有のオブジェクトです。Visual Basic または Visual J# に固有のイベントに応答するには、CSharpReferencesEvents という文字列をそれぞれ、VBReferencesEvents または VJSharpReferencesEvents に置き換えます。さまざまな種類のプロジェクトに固有のイベントに使用する文字列を判断する方法の詳細については、「イベント オブジェクト (プロジェクトの種類に固有)」を参照してください。
+= 演算子を使用して、手順 3. で取得したイベント オブジェクトから公開される各デリゲートに接続します。たとえば、ReferenceAdded イベントによって公開されたデリゲートに接続するには、次のプロシージャを使用します。
refEvents.ReferenceAdded += new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
イベント オブジェクトに関連する各イベントにプロシージャを追加します。たとえば、参照が追加されたときに発生するイベントを処理するには、次のプロシージャを追加します。
public void ReferenceAdded( VSLangProj.Reference addedRef ) { outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" + "\n" ); outputWinPane.OutputString( "The reference to " + addedRef.Name + " was added." + "\n" ); }
ReferencesEvents の場合、次のイベントを定義しておく必要があります。
および
次の完全な使用例には、これらのイベントが含まれています。
最終的に、アドインの終了後もウィンドウに関連するイベントを引き続き監視して、Visual Studio によってシステムの処理速度が下がらないようにするには、イベント処理を無効にする必要があります。Visual C# では、-= 演算子を使用してイベント処理を無効にします。たとえば、ReferenceAdded のイベント処理を無効にするには、次のプロシージャを使用します。
refEvents.ReferenceAdded -= new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
これにより、アドインを実行したままアドインまたは IDE がシャットダウンされるかどうかに関係なく、イベント処理が無効になります。IDE がシャットダウンされると、最初に、実行中のすべてのアドインが自動的にシャットダウンされます。
使用例
基本的な Visual Studio アドインの例を次に示します。この例では、Visual Studio で Visual C# 参照イベントを受け取って処理する方法について説明します。参照イベントが発生した場合は、必ず通知メッセージが [出力] ウィンドウに送信されます。
using System;
using Microsoft.VisualStudio.CommandBars;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using VSLangProj;
public Connect()
{
}
public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
// Retrieve the event objects from the automation model.
EnvDTE80.Events2 events =
(EnvDTE80.Events2)_applicationObject.Events;
// Send event messages to the Output window.
OutputWindow outputWindow =
(OutputWindow)_applicationObject.Windows.Item
(Constants.vsWindowKindOutput).Object;
outputWinPane =
outputWindow.OutputWindowPanes.Add
("ReferencesEvents Event Information");
// Retrieve the event objects from the automation model.
refEvents = (VSLangProj.ReferencesEvents)
events.GetObject("CSharpReferencesEvents");
// Connect to each delegate exposed from each object
// retrieved above.
refEvents.ReferenceAdded += new
_dispReferencesEvents_ReferenceAddedEventHandler
(this.ReferenceAdded);
refEvents.ReferenceChanged += new
_dispReferencesEvents_ReferenceChangedEventHandler
(this.ReferenceChanged);
refEvents.ReferenceRemoved += new
_dispReferencesEvents_ReferenceRemovedEventHandler
(this.ReferenceRemoved);
}
public void OnDisconnection(Extensibility.ext_DisconnectMode
disconnectMode, ref System.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 they have not been garbage collected.
if (refEvents != null)
{
refEvents.ReferenceAdded -= new
_dispReferencesEvents_ReferenceAddedEventHandler
(this.ReferenceAdded);
refEvents.ReferenceChanged -= new
_dispReferencesEvents_ReferenceChangedEventHandler
(this.ReferenceChanged);
refEvents.ReferenceRemoved -= new
_dispReferencesEvents_ReferenceRemovedEventHandler
(this.ReferenceRemoved);
}
}
// References related events.
public void ReferenceRemoved( VSLangProj.Reference removedRef )
{
outputWinPane.OutputString( "ReferencesEvents.ReferenceRemoved"
+ "\n" );
outputWinPane.OutputString( "The reference to " + removedRef.Name
+ " was removed." + "\n" );
}
public void ReferenceChanged( VSLangProj.Reference changedRef )
{
outputWinPane.OutputString( "ReferencesEvents.ReferenceChanged"
+ "\n" );
outputWinPane.OutputString( "The reference to " + changedRef.Name
+ " was changed." + "\n" );
}
public void ReferenceAdded( VSLangProj.Reference addedRef )
{
outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" +
"\n" );
outputWinPane.OutputString( "The reference to " + addedRef.Name
+ " was added." + "\n" );
}
public void OnAddInsUpdate(ref System.Array custom)
{
}
public void OnStartupComplete(ref System.Array custom)
{
}
public void OnBeginShutdown(ref System.Array custom)
{
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
private VSLangProj.ReferencesEvents refEvents;
private OutputWindowPane outputWinPane;
}}
コードのコンパイル方法
このコードをコンパイルするには、Visual C# で新しい Visual Studio アドイン プロジェクトを作成し、Connect クラスのコードを例のコードで置き換えます。アドインの実行方法については、「方法 : アドイン マネージャを使用してアドインを制御する」を参照してください。
参照
処理手順
方法 : 特定のプロジェクトのイベントに応答する (Visual Basic)