次の方法で共有


方法 : 特定のプロジェクトのイベントに応答する (Visual C#)

オートメーション モデルには、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) で環境イベントへの応答に使用できるオブジェクトが含まれています。VSLangProj および VSLangProj80 で定義された環境イベントは、Visual C# プロジェクトおよび Visual Basic プロジェクトに固有です。たとえば、ImportsEvents は、Visual Basic プロジェクトに対しインポートの追加または削除を行ったときに発生します。

この例では、Visual C# を使用し、プロジェクトの種類に固有の ReferencesEvents イベント ハンドラーをアドイン プロジェクトに追加します。ReferencesEvents は、Visual C# プロジェクトまたは Visual Basic プロジェクトで参照を変更、追加、または削除したときに発生します。

[!メモ]

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

Visual C# を使用して参照に関連するイベントを処理するには

  1. Visual C# で Visual Studio のアドイン プロジェクトを作成します。

  2. Connect.cs ファイルの先頭に using VSLangProj; を追加します。

  3. [プロジェクト] メニューの [参照の追加] をクリックし、[.NET] タブをクリックします。最初の [VSLangProj] を選択し、[OK] をクリックします。

  4. Connect クラスで、ReferencesEvents オブジェクトを処理する変数および OutputWindowPane を処理する別の変数を初期化します。

        private DTE2 _applicationObject;
        private AddIn _addInInstance;
        private VSLangProj.ReferencesEvents refEvents;
        private OutputWindowPane outputWinPane;
    

    この例では、変数の名前は refEvents です。

    オートメーション モデルのオブジェクトは、それぞれ、プロジェクトに固有のさまざまなイベントと関連付けられています。たとえば、ImportsEvents は、Imports コレクションに対しインポートの追加または削除を行ったときに発生します。また、BuildManagerEvents は、カスタム ツールの出力からビルドされた一時的なアセンブリに関連するイベントを表します。BuildManager オブジェクトの詳細については、「BuildManager オブジェクトの概要」を参照してください。プロジェクトの種類に固有のイベントの一覧については、「イベント オブジェクト (プロジェクトの種類に固有)」を参照してください。また、一般的なオートメーション イベントの一覧については、「オートメーション イベント オブジェクト」を参照してください。

  5. OnConnection メソッドでは、変数を初期化してイベントを受け取ります。この例では、変数は events と呼ばれます。

    EnvDTE80.Events2 events = 
    (EnvDTE80.Events2)_applicationObject.Events;
    
  6. OnConnection メソッドで、OutputWindow 変数を初期化します。

    OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item
    (Constants.vsWindowKindOutput).Object;
    outputWinPane = outputWindow.OutputWindowPanes.Add
    ("ReferencesEvents Event Information");
    
  7. また、OnConnection メソッドでは、オートメーション モデルからイベント オブジェクトを取得します。

    refEvents = 
    (VSLangProj.ReferencesEvents)events.GetObject
    ("CSharpReferencesEvents");
    

    この例では、ReferencesEvents は Visual C# プロジェクトに固有のオブジェクトです。Visual Basic に固有のイベントに応答するには、CSharpReferencesEvents という文字列を VBReferencesEvents に置き換えます。さまざまな種類のプロジェクトに固有のイベントに使用する文字列を判断する方法の詳細については、「イベント オブジェクト (プロジェクトの種類に固有)」を参照してください。

  8. += 演算子を使用して、手順 3. で取得したイベント オブジェクトから公開される各デリゲートに接続します。たとえば、ReferenceAdded イベントによって公開されたデリゲートに接続するには、次のプロシージャを使用します。

    refEvents.ReferenceAdded += new 
    _dispReferencesEvents_ReferenceAddedEventHandler
    (this.ReferenceAdded);
    
  9. イベント オブジェクトに関連する各イベントにプロシージャを追加します。たとえば、参照が追加されたときに発生するイベントを処理するには、次のプロシージャを追加します。

    public void ReferenceAdded( VSLangProj.Reference addedRef ) 
    { 
        outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" 
    + "\n" ); 
        outputWinPane.OutputString( "The reference to " + addedRef.Name
     + " was added." + "\n" ); 
    }
    

    ReferencesEvents の場合、次のイベントを定義しておく必要があります。

    および

    次の完全な使用例には、これらのイベントが含まれています。

  10. 最終的に、アドインの終了後もウィンドウに関連するイベントを引き続き監視して、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)

関連項目

+= 演算子 (C# リファレンス)

-= 演算子 (C# リファレンス)

その他の技術情報

オートメーション イベントへの応答

イベントへの応答 (Visual Basic および Visual C# プロジェクト)