コード マップを使用して依存関係をマップする

この記事では、コード マップを使用してコード間の依存関係を視覚化する方法について説明します。

コード マップとは

Visual Studio では、コード マップを使用すると、ファイルやコード行を読み取ることなく、プログラム コードがどのように組み合わされるかをより迅速に確認できます。 これらのマップを使用すると、構造とその依存関係、更新方法、提案された変更のコストの見積もりなど、コード内の組織と関係を確認できます。

Visual Studio でコード マップとの依存関係を表示する方法を示すスクリーンショット。

コードの依存関係は、次の言語でマップできます。

  • ソリューションまたはアセンブリ内の Visual C# または Visual Basic (.dll または .exe)

  • Visual C++ プロジェクト、ヘッダー ファイル (.h または #include)、バイナリでのネイティブまたはマネージド C++ コード

  • Microsoft Dynamics AX 用の .NET モジュールから作成された X++ プロジェクトとアセンブリ

Note

C# または Visual Basic 以外のプロジェクトでは、コード マップを開始したり、既存のコード マップに項目を追加したりするためのオプションが少なくなります。 たとえば、C++ プロジェクトのテキスト エディターでオブジェクトを右クリックしてコード マップに追加することはできません。 ただし、 ソリューション エクスプローラークラス ビューオブジェクト ブラウザーから個々のコード要素またはファイルをドラッグ アンド ドロップできます。

前提条件

Visual Studio でコード マップを作成するには、最初コード マップLive Dependency Validation コンポーネントをインストールします

コード マップを作成および編集するには、 Visual Studio Enterprise エディションが必要です。 ただし、Visual Studio Community および Professional エディションでは、Enterprise Edition で生成されたダイアグラムを開くことができますが、編集することはできません。

Note

Visual Studio Enterprise で作成されたマップを Visual Studio Professional を使用する他のユーザーと共有する前に、マップ上のすべての項目 (非表示アイテム、展開されたグループ、グループ間リンクなど) が表示されていることを確認してください。

コード マップを追加する

空のコード マップを作成し、アセンブリ参照、ファイル、フォルダーなどの項目をドラッグしたり、ソリューションのすべてまたは一部のコード マップを生成したりできます。

空のコード マップを追加するには:

  1. ソリューション エクスプローラーで、最上位レベルのソリューション ノードのショートカット メニューを開きます。 [ 追加>新しいアイテム] を選択します。

  2. [ 新しい項目の追加 ] ダイアログの [ インストール済み] で、[ 全般 ] カテゴリを選択します。

  3. Directed Graph Document(.dgml) テンプレートを選択し、[追加] を選択します。

    ヒント

    このテンプレートはアルファベット順に表示されない可能性があるため、表示されない場合は、テンプレート一覧の一番下まで下にスクロールします。

    ソリューションの ソリューション項目 フォルダーに空のマップが表示されます。

同様に、ソリューションに追加せずに新しいコード マップ ファイルを作成するには、 アーキテクチャ>新しいコード マップ または ファイル>New>File を選択します。

詳細情報:

ソリューションのコード マップを生成する

ソリューション内のすべての依存関係を表示するには:

  1. メニュー バーで、[アーキテクチャ] >[ソリューションのコード マップの生成] を選択します。 前回ビルドしてからコードが変更されていない場合は、代わりに [アーキテクチャ] を選択できます>ビルドせずにソリューションのコード マップを生成します。

    [ソリューションのコード マップの生成] コマンドを示すスクリーンショット。

    最上位レベルのアセンブリとそれらの間の集約されたリンクを示すマップが生成されます。 集計リンクが広いほど、それが表す依存関係が多くなります。

  2. コード マップ ツール バーの [凡例 ] ボタンを使用して、プロジェクトの種類アイコン (テスト、Web、電話プロジェクトなど)、コード 項目 (クラス、メソッド、プロパティなど)、および関係の種類 (継承、実装、呼び出しなど) の一覧を表示または非表示にします。

    アセンブリの最上位の依存関係グラフを示すスクリーンショット。

    このソリューション例には、ソリューション フォルダー (テストコンポーネント)、テスト プロジェクト、Web プロジェクト、アセンブリが含まれています。 既定では、すべての包含リレーションシップが グループとして表示され、展開したり折りたたんだりできます。 Externals グループには、プラットフォームの依存関係など、ソリューションの外部に含まれるものがあります。 外部アセンブリには、使用されている項目のみが表示されます。 既定では、システムベースタイプは、マップ上の煩雑さを軽減するために非表示になっています。

  3. マップをドリルダウンするには、プロジェクトとアセンブリを表すグループを展開します。 Ctrl キーを押しながら A キーを押してすべてのノードを選択し、ショートカット メニューから [グループ]、[展開] の順に選択すると、すべてを展開できます。

    コード マップで展開されているすべてのグループを示すスクリーンショット。

  4. ただし、これは大規模なソリューションでは役に立たない場合があります。 実際、複雑なソリューションの場合、メモリの制限により、すべてのグループを拡張できなくなる可能性があります。 代わりに、個々のノード内を表示するには、ノードを展開します。 ノードの上にマウス ポインターを移動し、シェブロン (下矢印) が表示されたらクリックします。

    コード マップ内のノードを展開する方法を示すスクリーンショット。

    または、項目を選択し、プラスキー (+) を押してキーボードを使用します。 より深いレベルのコードを調べるには、名前空間、型、およびメンバーに対して同じ操作を行います。

    ヒント

    マウス、キーボード、タッチを使用したコード マップの操作の詳細については、「 コード マップの参照と再配置」を参照してください。

  5. マップを簡略化し、個々のパーツに集中するには、コード マップ ツール バーの [フィルター ] を選択し、目的のノードとリンクの種類のみを選択します。 たとえば、すべてのソリューション フォルダーコンテナーとアセンブリ コンテナーを非表示にすることができます。

    コンテナーをフィルター処理してマップを簡略化する方法を示すスクリーンショット。

    また、基になるソリューション コードに影響を与えずに、個々のグループや項目を非表示にしたり、マップから項目を削除したりして、マップを簡略化することもできます。

  6. 項目間のリレーションシップを表示するには、マップ内でそれらを選択します。 リンクの色は、[ 凡例 ] ウィンドウに示すようにリレーションシップの種類を示します。

    ソリューション間の依存関係を表示する方法を示すスクリーンショット。

    この例では、紫色のリンクは呼び出し、点線のリンクは参照、水色のリンクはフィールド アクセスです。 緑のリンクは継承にすることも、複数の種類のリレーションシップ (またはカテゴリ) を示す集約リンクである場合もあります。

    ヒント

    緑色のリンクが表示される場合は、継承関係しかないという意味ではない可能性があります。 メソッド呼び出しもありますが、継承関係では非表示になります。 特定の種類のリンクを表示するには、[ フィルター ] ウィンドウのチェック ボックスを使用して、関心のない種類を非表示にします。

  7. 項目またはリンクに関する詳細情報を取得するには、ヒントが表示されるまでポインターをその上に移動します。 これにより、コード要素またはリンクが表すカテゴリの詳細が表示されます。

    リレーションシップのカテゴリを示すスクリーンショット。

  8. 集計リンクによって表される項目と依存関係を調べるには、まずリンクを選択し、そのショートカット メニューを開きます。 [ 共同投稿リンクの表示 ] を選択します (または 、新しいコード マップに投稿リンクを表示する) を選択します。 これにより、リンクの両端にあるグループが展開され、リンクに参加している項目と依存関係のみが表示されます。

  9. マップの特定の部分に焦点を当てるには、関心のない項目を引き続き削除できます。 たとえば、クラス ビューとメンバー ビューをドリルダウンするには、[フィルター] ウィンドウですべての名前空間ノードを フィルター 処理するだけです。

    クラスレベルとメンバー レベルにドリルダウンする方法を示すスクリーンショット。

  10. 複雑なソリューション マップに注目するもう 1 つの方法は、既存のマップから選択した項目を含む新しいマップを生成することです。 Ctrl キーを押しながら、フォーカスする項目を選択し、ショートカット メニューを開き、[選択] から [新しいグラフ] を選択します。

    選択した項目を新しいコード マップに表示する方法を示すスクリーンショット。

  11. 含まれているコンテキストは、新しいマップに引き継がされます。 [ フィルター ] ウィンドウを使用して、ソリューション フォルダーやその他のコンテナーを非表示にします。

    ビューを簡略化するためにコンテナーをフィルター処理する方法を示すスクリーンショット。

  12. グループを展開し、マップ内の項目を選択してリレーションシップを表示します。

    リレーションシップを表示する項目の選択を示すスクリーンショット。

こちらもご覧ください。

依存関係の表示

保留中の変更がある一部のファイルでコードレビューを行うとします。 これらの変更の依存関係を確認するには、それらのファイルからコード マップを作成します。

コード マップへの依存関係を示すスクリーンショット。

  1. ソリューション エクスプローラークラス ビュー、またはオブジェクト ブラウザーから新規または既存のコード マップに項目をドラッグします。 アイテムの親階層を含めるには、 Ctrl キーを 押しながら項目をドラッグするか、コード マップ ツール バーの [親を含める ] ボタンを使用して既定のアクションを指定します。 Windows エクスプローラーなど、Visual Studio の外部からアセンブリ ファイルをドラッグすることもできます。

    Note

    Windows Phone や Microsoft Store など、複数のアプリで共有されているプロジェクトからアイテムを追加すると、それらの項目は現在アクティブなアプリ プロジェクトと共にマップ上に表示されます。 コンテキストを別のアプリ プロジェクトに変更し、共有プロジェクトからさらに項目を追加すると、それらの項目が新しくアクティブなアプリ プロジェクトと共に表示されるようになります。 マップ上のアイテムで実行する操作は、同じコンテキストを共有するアイテムにのみ適用されます。

  2. マップには、含まれているアセンブリ内で選択した項目が表示されます。

    マップ上の項目をグループとして示すスクリーンショット。

  3. 項目を探索するには、項目を展開します。 項目の上にマウス ポインターを移動し、表示されたらシェブロン (下矢印) アイコンをクリックします。

    子項目を追加するための矢印を示すスクリーンショット。

    すべての項目を展開するには、Ctrl+キーを使用して項目を選択し、マップのショートカット メニューを開き、[グループ>Expand] を選択します。 ただし、すべてのグループを展開すると、使用できないマップまたはメモリの問題が発生する場合、このオプションは使用できません。

  4. 必要に応じて、関心のある項目をクラスやメンバーのレベルにまで引き続き展開してください。

    クラスとメンバー レベルに展開されたグループを示すスクリーンショット。

    コード内にあるがマップに表示されないメンバーを表示するには、グループの左上隅にある [子要素の再フェッチ] アイコン [子要素の再フェッチ] アイコン をクリックします。

  5. マップ上の項目に関連するその他の項目を表示するには、1 つを選択し、コード マップ ツール バーの [関連 項目の表示] を選択してから、マップに追加する関連項目の種類を選択します。 または、1 つ以上の項目を選択し、ショートカット メニューを開き、マップに追加する関連項目の種類の [表示 ] オプションを選択します。 例えば次が挙げられます。

    アセンブリの場合は、次を選択します。

    Option Description
    この参照先のアセンブリを表示する このアセンブリが参照するアセンブリを追加します。 [外部アセンブリ] グループに 外部アセンブリが 表示されます。
    これを参照するアセンブリを表示する このアセンブリを参照するアセンブリをソリューションに追加します。

    名前空間の場合は、[含むアセンブリを表示] を選択します (表示されない場合)。

    クラスまたはインターフェイスの場合は、次を選択します。

    Option Description
    基本型の表示 クラスの場合は、基底クラスと実装されたインターフェイスを追加します。

    インターフェイスの場合は、基本インターフェイスを追加します。
    派生型の表示 クラスの場合は、派生クラスを追加します。

    インターフェイスの場合は、派生インターフェイスと実装クラスまたは構造体を追加します。
    この参照先の型を表示する このクラスが使用するすべてのクラスとそのメンバーを追加します。
    これを参照する型を表示する このクラスを使用するすべてのクラスとそのメンバーを追加します。
    含まれている名前空間を表示する 親名前空間を追加します。
    含まれている名前空間とアセンブリを表示する 親コンテナー階層を追加します。
    すべての基本型を表示する 基底クラスまたはインターフェイス階層を再帰的に追加します。
    すべての派生型を表示する クラスの場合は、すべての派生クラスを再帰的に追加します。

    インターフェイスの場合は、すべての派生インターフェイスを追加し、クラスまたは構造体を再帰的に実装します。

    メソッドの場合は、次を選択します。

    Option Description
    この呼び出しのメソッドを表示する このメソッドが呼び出すメソッドを追加します。
    この参照先のフィールドを表示する このメソッドが参照するフィールドを追加します。
    含まれている型を表示する 親型を追加します。
    含まれている型、名前空間、およびアセンブリを表示する 親コンテナー階層を追加します。
    オーバーライドされたメソッドの表示 他のメソッドをオーバーライドするメソッドまたはインターフェイスのメソッドを実装するメソッドの場合は、オーバーライドされる基底クラス内のすべての抽象メソッドまたは仮想メソッドを追加し、存在する場合は実装されるインターフェイスのメソッドを追加します。

    フィールドまたはプロパティの場合は、次を選択します。

    Option Description
    含まれている型を表示する 親型を追加します。
    含まれている型、名前空間、およびアセンブリを表示する 親コンテナー階層を追加します。

    メソッドを表示するためのコマンドを示すスクリーンショット。

  6. マップにリレーションシップが表示されます。 この例では、マップは、 Find メソッドによって呼び出されたメソッドと、ソリューションまたは外部での場所を示しています。

    コード マップ上の特定の依存関係を示すスクリーンショット。

  7. マップを簡略化し、個々のパーツに集中するには、コード マップ ツール バーの [フィルター ] を選択し、目的のノードとリンクの種類のみを選択します。 たとえば、ソリューション フォルダー、アセンブリ、および名前空間の表示をオフにします。

    表示を簡略化するための [フィルター] オプションを示すスクリーンショット。