方法 : CodeModel オブジェクトを使用して Visual Basic コードを分析する

CodeModel2 オブジェクト階層を使用することにより、コード ファイルのテキストを解析する場合に生じる複雑なタスクを避けることができます。 CodeModel2 オブジェクトは、次の用途に使用できます。

  • コード構造の分析

  • コードをドキュメント化するときのベースとする場合

以降の手順は、マクロ開発環境にアクセスしてマクロ プロジェクトを作成する方法を知っていることを前提としています。 詳細については、「Add Macro Project Dialog Box」を参照してください。

名前空間は、CodeModel2 オブジェクトのルート レベルに含まれているか、他の CodeNamespace オブジェクトで入れ子になっています。 このことは、名前空間における構文の入力規則に影響します。 名前空間はトップレベルのコード ブロックになるか、別の名前空間に含まれるかのいずれかになります。 次の手順を使用するには、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) でプロジェクトを開いておく必要があります。

注意

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

プロジェクトに含まれたすべての名前空間を検索するには

  • 再帰的メソッドを記述して、アプリケーションのすべての名前空間を取得します。

    CodeNamespace オブジェクトには、名前空間の最初のレベルですべての CodeElements を含んでいる Members プロパティがあります。

    ' Macro editor
    Sub FindAllNamespaces()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       ' Look for all the namespaces in the CodeElements
       ' of the project.
       Dim list As String
       Dim ce As CodeElement
       For Each ce In cm.CodeElements
          If TypeOf ce Is CodeNamespace Then
             GetNamespace(CType(ce, CodeNamespace), list)
          End If
       Next
    
       MsgBox(list)
    End Sub
    
    Sub GetNamespace(ByVal ns As CodeNamespace, ByRef list As String)
       ' Add this namespace to the list.
       list &= ns.Name & ControlChars.CrLf
       Dim aspace As CodeNamespace
       Dim ce As CodeElement
       ' Look for more namespaces.
       For Each ce In ns.Members
          If TypeOf ce Is CodeNamespace Then
             GetNamespace(CType(ce, CodeNamespace), list)
          End If
       Next
    End Sub
    

    注意

    1 つのソース ファイル内のすべての名前空間を検索するには、そのソース ファイルに関連付けられた ProjectItem オブジェクトの FileCodeModel プロパティを使用します。この方法を使用するには、FindAllNamespaces メソッドに若干の変更が必要です。

既定の名前空間の検索

上記のプロシージャは、アプリケーションで定義済みの名前空間だけを返します。 すべての Visual Basic プロジェクトには、既定の名前空間も含まれています。 CodeElements コレクションには CodeNamespace オブジェクトが含まれませんが、アプリケーションのすべてのコード要素が既定の名前空間に含まれます。 既定の名前空間は、トップレベルの CodeType 要素から取得できます。

プロジェクトの既定の名前空間を検索するには

  • プロジェクトのトップレベルのコード要素を調べます。 CodeType である任意のコード要素は、プロジェクトの CodeNamespace 要素を返します。

    Sub FindDefaultNamespace()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       Dim ce As CodeElement
       Dim ct As CodeType = Nothing
       Dim defNameSpace As CodeNamespace
       For Each ce In cm.CodeElements
          If TypeOf ce Is CodeType Then
             ct = CType(ce, CodeType)
             defNameSpace = ct.Namespace
          End If
       Next
    
       If Not IsNothing(defNameSpace) Then
          MsgBox(defNameSpace.Name)
       End If
    End Sub
    

クラスの検索

クラス宣言および名前空間は、同様の方法で取得します。 クラスはほかのクラスに入れ子になっているため、名前空間で定義されたクラスも、ほかのクラスで定義されたクラスも検索できます。

プロジェクトに含まれたすべてのクラスを検索するには

  • プロジェクトのクラス宣言を検索するには、次のような再帰的メソッドを記述します。

    ' Macro editor
    Sub FindAllClasses()
       Dim cm As CodeModel
       cm = DTE.Solution.Projects.Item(1).CodeModel
    
       ' Look for all the namespaces and classes in the 
       ' project.
       Dim list As String
       Dim ce As CodeElement
       For Each ce In cm.CodeElements
          If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then
             ' Determine whether that namespace or class 
             ' contains other classes.
             GetClass(ce, list)
          End If
       Next
    
       MsgBox(list)
    End Sub
    
    Sub GetClass(ByVal ct As CodeElement, ByRef list As String)
       ' ct could be a namespace or a class. Add it to the list
       ' if it is a class.
       If (TypeOf ct Is CodeClass) Then
          list &= ct.Name & ControlChars.CrLf
       End If
    
       ' Determine whether there are nested namespaces or classes that 
       ' might contain other classes.
       Dim aspace As CodeNamespace
       Dim ce As CodeElement
       Dim cn As CodeNamespace
       Dim cc As CodeClass
       Dim elements As CodeElements
       If (TypeOf ct Is CodeNamespace) Then
          cn = CType(ct, CodeNamespace)
          elements = cn.Members
       Else
          cc = CType(ct, CodeClass)
          elements = cc.Members
       End If
    
       For Each ce In elements
          If (TypeOf ce Is CodeNamespace) Or (TypeOf ce Is CodeClass) Then
             GetClass(ce, list)
          End If
       Next
    End Sub
    

参照

処理手順

方法 : CodeModel オブジェクトを使用して C# クラスを作成する

概念

Visual Basic アプリケーションおよび C# アプリケーションの CodeModel オブジェクトの概要

コード モデルを使用したコードの調査 (Visual Basic)

コード モデルを使用したコードの調査 (Visual C#)