Visual Basic アプリケーションおよび C# アプリケーションの CodeModel オブジェクトの概要
更新 : 2007 年 11 月
Visual Basic、Visual C#、または Visual J# のアプリケーションでは、コードの構造をプログラムで調査することが必要になる場合があります。アプリケーションで定義された名前空間およびその入れ子の関係を理解することも必要になります。また、ドキュメントのベースとしてクラスおよびそのパブリック メンバを記載したドキュメントを作成することも必要になる場合があります。
CodeModel2 オブジェクトは、アプリケーションのコードにアクセスする汎用機能拡張オブジェクトです。CodeModel2 オブジェクトには、コードの一覧を表すテキストは用意されていません。代わりに、コード要素を表す、入れ子になったオブジェクトのコレクションが用意されています。たとえば、コードの各名前空間は、CodeNamespace オブジェクトによって表されます。プロジェクトに関連付けられた CodeModel2 オブジェクトには、CodeModel プロパティでアクセスします。
FileCodeModel2 オブジェクトは、1 つのソース ファイルのコードにアクセスする汎用機能拡張オブジェクトです。アプリケーションの各ソース ファイルは ProjectItem オブジェクトによって表され、プロジェクト項目に関連付けられた FileCodeModel2 オブジェクトは FileCodeModel プロパティで確認できます。
CodeModel2 オブジェクトおよび FileCodeModel2 オブジェクトの両方には、それぞれ CodeModel2.CodeElements プロパティおよび FileCodeModel.CodeElements プロパティが用意されています。このプロパティは CodeElement2 オブジェクトのコレクションです。Visual Basic、Visual C#、および Visual J# では、少し異なる方法で CodeModel2 オブジェクトおよび FileCodeModel オブジェクトをサポートしています。Visual Basic の実装の例については、「コード モデルを使用したコードの調査 (Visual Basic)」および「方法 : CodeModel オブジェクトを使用して Visual Basic コードを分析する」を参照してください。Visual C# の実装の例については、「コード モデルを使用したコードの調査 (Visual C#)」および「方法 : CodeModel オブジェクトを使用して C# クラスを作成する」を参照してください。
一部の言語では、Visual Studio コード モデル全体が実装されません。ヘルプ トピックは、例外が存在する場合にその例外を示します。コード モデルの実装間の相違点の多くは、各言語で機能が異なることが原因です。たとえば、トップ レベルの関数定義は Visual C++ でしか機能しないため、Visual Basic、Visual C#、または Visual J# では、CodeNamespace オブジェクトに関数を追加できません。
主要なコード モデル オブジェクトの一覧を次の表に示します。各プロジェクトのメソッドおよびプロパティの一覧を参照するには、リンクをクリックしてください。
型 |
説明 |
---|---|
ソース ファイル内の名前空間構成体を表します。 |
|
ソース コード内の構造体を表します。 |
|
ソース コード内のインターフェイスを表します。 |
|
ソース コード内のクラスを表します。 |
|
ソース コード内の列挙型を表します。 |
|
ソース ファイル内の変数構成体を定義します。 |
|
ソース コード内のデリゲートを表します。 |
|
ソース ファイル内のコード要素または構成体を表します。 |
|
コード イベント要素をモデル化します。 |
|
ソース ファイル内のプロパティ コンストラクタを定義します。 |
|
コード要素の属性を定義します。 |
|
名前空間をインポートするステートメントの使用をモデル化します。 |
|
ソース ファイル内の関数構造を表します。 |
|
関数やプロパティなどに対するパラメータを定義します。 |
入れ子になったコード要素
アプリケーションのコード要素は、入れ子になったアーキテクチャで構成されます。たとえば、プロジェクト項目の FileCodeModel2 は、CodeElements コレクションに、名前空間のコード要素を含んでいる場合があります。その名前空間を表す CodeNamespace オブジェクトには、そのオブジェクトの Members プロパティのクラスを表す他のコード要素が複数含まれている場合があります。各 CodeClass2 要素には、さらにプロパティ (CodeProperty2 オブジェクト) およびメソッド (CodeFunction2 オブジェクト) を表すコード要素が含まれている場合があります。入れ子になったコード要素を取得する方法は、コード要素の型によって異なります。この方法については、次のセクションで説明します。
コード要素のカテゴリ
CodeElement2 クラスは、プロジェクト項目 (ソース ファイル) のすべてのコード要素を表す基本クラスです。多くのクラスは、CodeElement2 から派生し、名前空間、クラス、プロパティ、メソッド、イベントなど、アプリケーションの構成要素を表します。コード要素は、大きく 2 つのカテゴリに分類されます。1 つは型を表すコード要素、もう 1 つはそれ以外のコード要素です。
アプリケーションには、型を表すコード要素がいくつかあります。このようなコード要素は、CodeElement2 オブジェクトだけでなく、CodeType オブジェクトからも派生しています。
IsCodeType プロパティを使用して、CodeElement2 オブジェクトへの参照が上記のいずれかの型であるかどうかを確認できます。これらの型の入れ子になったコード要素を検索するには、Members プロパティを使用します。このプロパティは CodeElements コレクションを返します。「方法 : CodeModel オブジェクトを使用して Visual Basic コードを分析する」には、プロジェクト内のすべてのクラスを検索する例が提供されています。
ほかの型のコード要素下に入れ子にされたコード要素を検索する方法は、入れ子になったコード要素の種類によって異なります。たとえば、プロパティには Get メソッドおよび Set メソッドしかないため、プロパティに関連付けられた CodeProperty2 オブジェクトには、CodeFunction2 要素を返す Getter プロパティおよび Setter プロパティがあります。コード要素型の入れ子になったコード要素を検索するために使用するプロパティの一覧を次に示します。
型 |
プロパティ |
---|---|
CodeFunction |
|
CodeNamespace |
|
CodeProperty |
外部参照からのコード要素
プロジェクト参照で定義された型の型宣言をコードに含めることができます。プロジェクト参照は、[参照の追加] ダイアログ ボックスまたは References.Add 機能拡張メソッドを使用して追加されます。Visual Basic プロジェクト システムでは、名前以外のオブジェクト参照を表す CodeTypeRef2 オブジェクトは解決されません。したがって、この参照に関連付けられた CodeElement2 オブジェクトの他のプロパティまたはメソッドを使用すると、Name プロパティ以外では、"実装されていません" という例外がスローされます。このような参照は "type-name only" コード要素と呼ばれます。外部参照を表す CodeType オブジェクトでは、InfoLocation プロパティは vsCMInfoLocationNone に設定されています。
コンパイル エラーおよび CodeModel オブジェクト
CodeElement2 オブジェクトへの参照を保持するコードを記述する場合は、参照を保持している間に基になるソース コードが変更される可能性があることに注意してください。コード要素が削除されたり、名前が変更されたり、コンパイラ エラーの原因となったりする場合があります。そのような場合は、CodeElement2 オブジェクトを呼び出すと、"HRESULT からの例外です : 0x80047E2C。" というエラー メッセージが表示されます。
参照
処理手順
方法 : CodeModel オブジェクトを使用して Visual Basic コードを分析する
Visual Basic および Visual C# の機能拡張のトラブルシューティング