方法 : DTE オブジェクトおよび DTE2 オブジェクトへの参照を取得する
EnvDTE アセンブリでは、DTE オブジェクトは、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) を表し、オートメーション モデル階層の最上位のオブジェクトになります。すべてのオートメーション アプリケーションでは、主要なオートメーション モデルにアクセスするために、このオブジェクトへの参照が必要になります。これは、Visual Studio でも引き続き当てはまります。
ただし、EnvDTE80 アセンブリを追加すると、DTE2 という名前の最上位のオブジェクトに置き換えられます。このオブジェクトは、DTE オブジェクトの代わりに使用されます。この 2 つのオブジェクトの動作およびプログラムは同じですが、DTE2 は、新しい機能を含んでおり、新しいオブジェクトとコレクションおよび更新されたオブジェクトとコレクションを数多くホストしています。
したがって、新しいオートメーション アプリケーションおよびアドインを作成する場合、両方のオブジェクトへの参照を作成する必要があります。新しい DTE2 オブジェクトでは、新しい機能にアクセスできますが、DTE オブジェクトは、残っている主要なオートメーション機能にアクセスできます。できる限り、DTE 内のオブジェクトおよびコレクションではなく、DTE2 にある新しいオブジェクトおよびコレクションを使用する必要があります。
次の手順では、DTE2 オブジェクトへの参照を取得する方法を示します。この手順は、DTE オブジェクトにも当てはまります。オブジェクトへの参照を追加する前に、適切なアセンブリおよびタイプ ライブラリへの参照を追加する必要があります。詳細については、「方法: オートメーション名前空間に参照を追加する」を参照してください。
プログラム識別子 (ProgID) を使用するVisual Studio 2012 VisualStudio.DTE.11.0 です。返されたオブジェクトは、DTE2 インターフェイスにキャストできます。
DTE2 のプロパティ、メソッド、およびイベントは、呼び出されたときに、DTE 型を返します。たとえば、Solution は、Solution オブジェクトを返しますが、Solution2 オブジェクトを返しません。このため、DTE2 メンバーまたは他の型のメンバーを使用する場合は、これらのメンバーを明示的に型キャストする必要があります。これは、多くの理由で意図的に行われました。第一の理由として、一貫性を保ち、混乱を減らすことが挙げられます。EnvDTE80.dll アセンブリは、すべての DTE2 プロパティに対し、一貫して同じインターフェイスを返します。最新のインターフェイスのバージョンを返すことは、混乱状態を招く場合があります。たとえば、Visual Studio の将来のバージョンに DTE3 型がある場合、インターフェイスによっては、DTE、DTE2、または DTE3 を返すことがあります。さらに、EnvDTE80 の "2" インターフェイスが EnvDTE インターフェイスから派生していることが原因で、COM 相互運用の問題が発生する場合があります。たとえば、Window2 は、Window から派生しています。DTE プロパティを Window2 に追加した場合、このプロパティは、Windows プロパティを非表示にし、COM アプリケーションで正しく動作しなくなります。
[!メモ]
実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。
Visual Basic と C# で DTE2 オブジェクトを参照するには
コードに次のように追加します。
' Get an instance of the currently running Visual Studio IDE. Dim DTE2 as EnvDTE80.DTE2 DTE2 = System.Runtime.InteropServices.Marshal. _ GetActiveObject("VisualStudio.DTE.11.0")
// Get an instance of the currently running Visual Studio IDE. EnvDTE80.DTE2 dte2; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.11.0");
Visual C++ (ATL) で DTE オブジェクトまたは DTE2 オブジェクトを参照するには
コードに次のように入力します。
CComPtr<EnvDTE::_DTE> m_pDTE; CComPtr<EnvDTE80::DTE2> m_pDTE2; CLSID clsid; CLSID clsid2; CLSIDFromProgID(L"VisualStudio.DTE.11.0",&clsid); CLSIDFromProgID(L"VisualStudio.DTE.11.0",&clsid2); CComPtr<IUnknown> punk; CComPtr<IUnknown> punk2; // Get a running instance of Visual Studio. HRESULT hr = GetActiveObject(clsid,NULL,&punk); hr = GetActiveObject(clsid2,NULL,&punk2); m_pDTE = punk; m_pDTE2 = punk2;