方法: .NET コードに対する依存関係グラフを生成する
.NET コード内の編成や関係を調べるには、Visual Studio Ultimate を使用して依存関係グラフを生成します。 このグラフを使用すると、コード内の依存関係の視覚化、探索、および分析に役立ちます。 グラフでは、コード要素とその関係を、リンク (エッジ) によって接続されている一連のノードとして表します。
注意
非常に大きなソリューションがある場合は、依存関係グラフを生成するとメモリ不足例外が発生することがあります。 この例外が発生した場合は、ソリューションのスコープを縮小します。 アーキテクチャ エクスプローラーで視覚化するプロジェクトと依存関係を選択し、その後でグラフを生成することもできます。
C および C++ コードと Web プロジェクトの依存関係グラフを生成するには、Microsoft Visual Studio 2010 Visualization and Modeling Feature Pack をダウンロードしてインストールします。
詳細については、次のトピックを参照してください。
生成する依存関係グラフを選択する
Visual Studio Ultimate では、コード内の依存関係を調べるためのグラフ ドキュメントをすばやく生成できます。コマンド ライン ツールを使用してグラフ ドキュメントを生成する場合は、「バッチ処理用のグラフ ドキュメントを生成する」を参照してください。
目的 |
生成するグラフに表示される関係 |
---|---|
ソース コードの概要を表示する |
Visual Studio ソリューション内のすべてのアセンブリ、すべての名前空間、またはすべてのクラス間の関係。 グラフには、選択したノードのトップ レベルの集約された依存関係が表示されます。 |
ソース コード内の特定の依存関係を表示する |
Visual Studio ソリューション内のソース コードの選択された領域間の関係。 コードを階層的に参照し、特定の種類の構造と関係を選択するには、アーキテクチャ エクスプローラーを使用します。 |
コンパイルされたコードの概要を表示する |
1 つまたは複数の .NET アセンブリ (.dll) ファイルまたは実行可能 (.exe) ファイル内の関係。 |
コンパイルされたコード内の特定の依存関係を確認する |
.NET アセンブリ (.dll) ファイルまたは実行可能 (.exe) ファイル内の選択された領域間の関係。 特定の種類の構造と関係を参照して選択するには、アーキテクチャ エクスプローラーを使用します。 |
グラフを生成したら、そのグラフを使用してコードをさまざまな方法で調べることができます。 詳細については、「方法: 依存関係グラフを使ってコードを調べる」を参照してください。
Visual Studio ソリューション内のソース コードの概要を表示する
ソリューションを開きます。
[アーキテクチャ] メニューの [依存関係グラフの生成] をポイントし、次の手順のいずれかを選択します。
クリック対象
生成するグラフに表示される内容
[アセンブリ別]
ソリューションによって生成されるすべてのアセンブリと、それらが依存する外部依存関係の間の集約された依存関係。
アセンブリ内の名前空間、クラス、およびメソッドを表示するには、グラフ上のアセンブリを展開します。 外部アセンブリには、使用中の項目のみが表示されます。
[名前空間別]
ソリューション内のすべての名前空間と、コードが依存する外部名前空間の間の集約された依存関係。
名前空間内のクラスとメソッドを表示するには、グラフ上の名前空間を展開します。 外部名前空間には、使用中の項目のみが表示されます。
[クラス別]
ソリューション内のすべてのクラス間の集約された依存関係。 コードで使用される外部クラスに関する情報は表示されません。
または
複数の種類の構造間の依存関係を表示するには、[カスタム] をクリックします。
[依存関係グラフの生成] ダイアログ ボックスで、[アセンブリ]、[名前空間]、[型]、または [メソッド] の各ボックスの少なくとも 1 つをクリックします。
グラフをフィルター処理するには、次の表を使用します。
目的
実行する手順
外部依存関係への参照を表示する。
内部アセンブリが外部アセンブリでどのようにビルドされるかを調べる場合に便利です。
[外部] を選択します。
特定のアクセス レベルを持つ型とメソッドのみを表示する。
たとえば、パブリック型のみを選択することでグラフを簡素化できます。
[アクセス フィルター] ウィンドウを展開し、目的のレベルを選択します。
メモ少なくとも 1 つの型アクセス レベルを選択する必要があります。グラフの依存関係の数を減らすには、メソッドに使用するアクセス レベルのみを選択します。コンテインメント関係を入れ子になったグループ、依存関係を集約されたリンクとして表示することで、全体的な依存関係を表示する。
メモメソッドの場合、依存関係は集約されたリンクではなく個々のリンクとして表示されます。これは、メソッドは最下位レベルの葉ノードであるためです。[コンテインメントをグループとして表示] チェック ボックスをオンにします。
コンテインメント関係をリンクされたノード、依存関係を個々のリンクとして表示することで、詳細な依存関係を表示する。
[コンテインメントをグループとして表示] チェック ボックスをオフにします。
終了したら、[OK] をクリックします。
Visual Studio によって有向グラフのドキュメント (.dgml ファイル) が生成され、開きます。
集約された依存関係のリンクの深さは、集約された依存関係が表す個々の依存関係の、おおよその数を示します。 リンクが表す依存関係の種類を表示するには、ツールヒントが表示されるまでリンク上でポインターを動かします。
注意
[アーキテクチャ] メニューから生成する依存関係グラフには、最派生型に依存する仮想メソッドの呼び出しが表示されません。 代わりに、それらの仮想メンバーを宣言する型への依存関係が表示されます。 ただし、アーキテクチャ エクスプローラーのクラス ビューを使用すると、それらの呼び出しを検索できます。 その後、見つかった呼び出しをアーキテクチャ エクスプローラーから既存のグラフにドラッグするか、またはアーキテクチャ エクスプローラーのツール バーから新しいグラフを生成できます。
Visual Studio ソリューションのソース コード内の特定の依存関係を表示する
アーキテクチャ エクスプローラーを使用して、視覚化するコードおよび関係を検索します。 定義済みのクエリを使用してグラフを生成することもできます。
ソリューションを開きます。
アーキテクチャ エクスプローラーが開いていない場合は、[アーキテクチャ] メニューの [Windows] をポイントし、[アーキテクチャ エクスプローラー] をクリックします。
アーキテクチャ エクスプローラーの最初の列で、[Visual Studio] の下にある次のビューの 1 つをクリックします。
クラス ビュー: コードの論理階層を調べます。
名前空間、型、メソッドなどの参照に使用します。
ソリューション ビュー: コードの物理階層を調べます。
プロジェクト、ソース ファイルなどの参照に使用します。
次の列で、確認する項目を選択します。 列の項目をすべて選択するには、Ctrl キーを押しながら A キーを押します。
次の列に、その列の既定の種類の項目と関係に基づいて、選択内容に関連する項目が表示されます。
注意
他の種類の項目と関係を選択するには、列の右側で折りたたまれた列を選択して展開します。 [ノード ナビゲーション] で、目的の種類の項目を選択します。 [アウトバウンド ナビゲーション] または [インバウンド ナビゲーション] で、目的の種類の関係を選択します。 詳細については、「方法: アーキテクチャ エクスプローラーを使用してコードを検索する」を参照してください。
目的の項目がすべて選択されるまで、手順 4. を繰り返します。
注意
グラフに呼び出し依存関係を含めるには、選択したクラスによって呼び出されるすべてのメソッドを参照して選択します。
選択内容から新しいグラフを作成するには、アーキテクチャ エクスプローラーのタイトル バーの下にある [選択したすべてのノードから、新しいグラフ ドキュメントを作成します] をクリックします。
Visual Studio によって有向グラフのドキュメント (.dgml ファイル) が生成され、開きます。
または
選択内容を既存のグラフまたは空のグラフに追加するには、次の手順を実行します。
既存のグラフの .dgml ファイルを開くか、空のグラフを作成します。
アーキテクチャ エクスプローラーのタイトル バーの下にある [選択したすべてのノードを、現在表示されているグラフ ドキュメントに追加します] をクリックします。
または
アーキテクチャ エクスプローラーからグラフにノードをドラッグします。
空のグラフを作成する
空のグラフを開くには、[ファイル] メニューの [新規作成] をポイントし、[ファイル] をクリックします。
または
空のグラフを [ソリューション項目] フォルダーに追加するには、ソリューション エクスプローラーで、最上位のソリューション ノードを右クリックし、[新しい項目の追加] をクリックします。
[インストールされているテンプレート] の [全般] をクリックします。
右ペインで、[有向グラフのドキュメント] をクリックし、グラフに名前を付け、[追加] をクリックします。
グラフを操作するさまざまな方法の詳細については、空のグラフに表示されるヘルプ リンクをクリックしてください。
定義済みのクエリを使用してソース コードを調べる
ソリューションを開きます。
アーキテクチャ エクスプローラーが開いていない場合は、[アーキテクチャ] メニューの [Windows] をポイントし、[アーキテクチャ エクスプローラー] をクリックします。
アーキテクチャ エクスプローラーの最初の列で、[保存された DGQL クエリ] の下にある [フォルダー内] をクリックします。
次の列で、生成するグラフの種類に応じて次のクエリの 1 つをクリックします。
生成するグラフに表示される内容
クリック対象
ソリューションで参照されるすべてのアセンブリ。
クエリ結果から、これらのアセンブリ間の依存関係を示すグラフを生成できます。
All Assembly References.dgql
依存関係リンクのないソリューション内のすべての出力アセンブリの一覧。
All Output Assemblies.dgql
選択したアセンブリの標準の依存関係グラフを生成するには、次の手順を実行します。
次の列で、目的のアセンブリを選択します。
現在の列の右側で、折りたたまれたアクション列をクリックして展開します。
メモアクション列の上にポインターを移動すると、強調表示されます。アクション列の [コマンド] で、[標準グラフ] をクリックします。
ソリューション内のすべてのプロジェクト。
クエリ結果から、これらのプロジェクト間の参照を示すグラフを生成できます。
All Project References.dgql
ソリューション内のすべてのプロジェクトの一覧。
ソリューションにソリューション フォルダーが含まれる場合、この一覧は、アーキテクチャ エクスプローラーで [ソリューション ビュー] をクリックしたときに表示される一覧とは異なります。
All Projects.dgql
ソリューション内のすべての型。
クエリ結果から、これらの型間の継承関係を示すグラフを生成できます。
Inheritance Graph.dgql
次の列に、結果が一覧として表示されます。 これらのノード間にリンクが存在する可能性もありますが、アーキテクチャ エクスプローラーには表示されません。
結果列のすべての項目のグラフ (リンクを含む) を生成するには、次の手順を実行します。
結果列で、Ctrl キーを押しながら A キーを押して、すべての項目を選択します。
Ctrl キーを押しながらグラフの現在の列の項目のみを選択し、アーキテクチャ エクスプローラーのタイトル バーの下にある [選択したすべてのノードから、新しいグラフ ドキュメントを作成します] をクリックします。
Visual Studio によって有向グラフのドキュメント (.dgml ファイル) が生成され、開きます。
コンパイルされたコードの概要を表示する
空のグラフを作成するか、既存のグラフの .dgml ファイルを開きます。
Visual Studio の外部から、.dll ファイルまたは .exe ファイルをグラフにドラッグします。
注意
ソリューション エクスプローラーの [参照設定] フォルダーからのドラッグはサポートされていません。 Windows エクスプローラーからアセンブリをドラッグできるのは、Windows エクスプローラーと Visual Studio を同じユーザー アクセス制御 (UAC) アクセス許可レベルで実行している場合のみです。 たとえば、UAC がオンになっていて、Visual Studio を管理者として実行している場合、Windows エクスプローラーはドラッグ操作をブロックします。 この問題を回避するには、UAC をオフにするか、定義済みのクエリを使用してソリューションを調べます。
コンパイルされたコード内の特定の依存関係を表示する
アーキテクチャ エクスプローラーが開いていない場合は、[アーキテクチャ] メニューの [Windows] をポイントし、[アーキテクチャ エクスプローラー] をクリックします。
最初の列の [ファイル システム] で [ファイルの選択] をクリックします。
[開く] ダイアログ ボックスで、.dll ファイルまたは .exe ファイルを参照し、それらを選択して開きます。
次の列で、アセンブリを選択します。 列の項目をすべて選択するには、Ctrl キーを押しながら A キーを押します。
次の列に、その列の既定の種類の項目と関係に基づいて、選択内容に関連する項目が表示されます。
注意
他の種類の項目と関係を選択するには、列の右側で折りたたまれた列を選択して展開します。 アクション列の上にポインターを移動すると、強調表示されます。 [ノード ナビゲーション] で、目的の種類の項目を選択します。 [アウトバウンド ナビゲーション] または [インバウンド ナビゲーション] で、目的の種類の関係を選択します。 詳細については、「方法: アーキテクチャ エクスプローラーを使用してコードを検索する」を参照してください。
次のいずれかを選択します。
依存関係グラフの作成に使用する項目
手順
アセンブリ
アセンブリを含む列の右側で、折りたたまれたアクション列をクリックして展開します。
アクション列の上にポインターを移動すると、強調表示されます。
アクション列の [コマンド] で、[標準グラフ] をクリックします。
クラスとメソッド
クラスとメソッドを参照し、グラフに含めるすべての項目を選択します。
新しいグラフを作成するには、アーキテクチャ エクスプローラーのタイトル バーの下にある [選択したすべてのノードから、新しいグラフ ドキュメントを作成します] をクリックします。
Visual Studio によって有向グラフのドキュメント (.dgml ファイル) が生成され、開きます。
または
選択内容を既存のグラフまたは空のグラフに追加するには、次の手順を実行します。
既存のグラフの .dgml ファイルを開くか、空のグラフを作成します。
アーキテクチャ エクスプローラーのタイトル バーの下にある [選択したすべてのノードを、現在表示されているグラフ ドキュメントに追加します] をクリックします。
または
アーキテクチャ エクスプローラーからグラフにノードをドラッグします。
バッチ処理用のグラフ ドキュメントを生成する
バッチ モードでグラフ ドキュメント (.dgml ファイル) を生成するには、GraphCmd.exe コマンド ライン ツールを使用します。 たとえば、各ビルドの後にツールを実行することにより、ビルド間で変更された依存関係を検索できます。
このツールは、C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE フォルダー内にあります。
注意
GraphCmd.exe では、アセンブリまたは .dgml ファイルの依存関係情報のみを生成します。Visual Studio ソリューションのソース コードまたはプロジェクト ファイルの依存関係情報は生成されません。
GraphCmd.exe の構文は次のとおりです。
GraphCmd -? -all -exceptions -input File_Name -query File_Name -exec
"DGQL_Statement" -output File_Name -path alias=path
GraphCmd.exe のオプションの説明を次の表に示します。
-? |
GraphCmd.exe に関するヘルプを表示します。 |
-all |
最終のノード セットだけでなく、すべてのクエリの中間結果を含めます。 |
-exceptions |
クエリの例外をグラフ ドキュメント (.dgml) ファイルとして報告します。 |
-input ファイル名 |
指定された .dgml ファイルを処理します。 これは、サイズが大きい .dgml ファイルの後処理およびフィルター処理に役立ちます。これにより、Visual Studio で .dgml ファイルを簡単に視覚化できます。 |
-query ファイル名 |
指定された Directed Graph Query Language (DGQL または .dgql) ファイルを実行します。 詳細については、次のトピックを参照してください。
|
-exec "DGQL ステートメント" |
指定された DGQL ステートメントを実行します。 詳細については、「Directed Graph Query Language (DGQL) について」を参照してください。 |
-output ファイル名 |
指定された .dgml ファイルを出力します。 |
-path エイリアス=パス |
DGML ドキュメントの入出力で使用する新しいエイリアスを指定します。 次に例を示します。
詳細については、「よく使用されるパスのエイリアス」を参照してください。 |
解説
GraphCmd.exe は Visual Studio の外部で実行されるため、.dgql クエリの処理のサポートは制限されます。
オプション (-input、-query、-exec、および -path) を複数回指定できます。
よく使用されるパスのエイリアス
よく使用されるパスのエイリアスを使用すると、.dgml ファイルのサイズを小さくして、ファイルの読み込みまたは保存に必要な時間を短縮することができます。 エイリアスを作成するには、.dgml ファイルの末尾に <Paths></Paths> セクションを追加します。 このセクションには、パスのエイリアスを定義する <Path/> 要素を追加します。
<Paths>
<Path Id="MyPathAlias" Value="C:\...\..." />
</Paths>
.dgml ファイル内の要素からエイリアスを参照するには、<Path/> 要素の Id をドル記号 ($) とかっこ (()) で囲みます。
<Nodes>
<Node Id="MyNode" Reference="$(MyPathAlias)MyDocument.txt" />
</Nodes>
<Properties>
<Property Id="Reference" Label="My Document" DataType="System.String" IsReference="True" />
</Properties>
.dgml ファイルの編集の詳細については、「方法: グラフ ドキュメントを編集およびカスタマイズする」を参照してください。
Directed Graph Query Language (DGQL) について
DGQL は、DGML の作成に使用できる軽量なクエリ言語です。 DGQL ステートメントは、ノード選択およびアクションの交互パターンに従います。これにより、各ノード選択によって次のアクションの入力が生成され、その出力が次のノード選択の入力になります。
DGQL ステートメントの形式は次のとおりです。
<node selection> / <action> / <node selection> / <action> / ...
ノード選択に使用される DGQL の構文を次の表に示します。
* |
すべてのノードを選択します。 |
+ "text" |
"text" を含むすべてのノードを選択します。 |
+ Id.Equals("text") |
Id が "text" と等しいすべてのノードを選択します。 |
+ Background.Contains("text") |
Background 属性の値に文字列 "text" が含まれるすべてのノードを選択します。 |
+ "text1" + "text2" + ... |
"text1" または "text2" に一致するすべてのノードを選択します。 |
+ MyProperty="True" |
MyProperty プロパティの値が "True" であるすべてのノードを選択します。 |
- Label.Contains("text") |
Label 属性に文字列 "text" が含まれる (Contains) ノードを除くすべてのノードを選択します。 |
+ Category.Is("MyCategory") |
MyCategory カテゴリを持つ、または MyCategory を継承するすべてのノードを選択します。 |
アクションは Visual Studio に登録されている DGML データ プロバイダーから提供されますが、アーキテクチャ エクスプローラーで作成されたクエリを保存することにより、それらのアクションを検出できます。 アーキテクチャ エクスプローラーの詳細については、「方法: アーキテクチャ エクスプローラーを使用してコードを検索する」を参照してください。
選択されたノードで実行できる直接的なアクションの例を次の表に示します。
アクションの例 |
説明 |
---|---|
Microsoft.Contains |
入力ノードに格納されているすべてのノードを返します。 Contains を別のリンク カテゴリに置き換えることができます。 |
Microsoft.Open |
入力ノードのソース コードを開きます。
メモ
Visual Studio 内でのみ動作します。
|
Microsoft.AllOutBoundLinks |
入力ノードからの出力リンク先であるすべてのノードを返します。 |
Microsoft.AllInboundLinks |
入力ノードへのリンクのソース端であるすべてのノードを返します。 |
Microsoft.Core.CreateGroupsByProperties |
GroupByProperties アクションを呼び出します。 |
Microsoft.AllNodes |
その時点までのグラフ全体のすべてのノードを返します。 |
データ ドリブン アクションでは、入力ノードおよびリンク内のデータのみに基づいて項目を選択します。 データ ドリブン アクションを使用してカテゴリを照合するときは、継承されたカテゴリが含まれます。 データ ドリブン アクションの例を次の表に示します。
種類 |
説明 |
---|---|
Node:Both:Category |
Category カテゴリを持ち、いずれかの方向を指すリンクによって入力ノードに接続されているすべてのノードを返します。 |
Link:Both:Category |
いずれかの方向を指すリンクによって入力ノードに接続されており、Category カテゴリを持つすべてのノードを返します。 |
Link:Backward:Category |
Category カテゴリを持つリンクを含む入力ノードを指すすべてのノードを返します。 |
Link:Forward:Category |
Category カテゴリを持つリンクを含む入力ノードが指すすべてのノードを返します。 |
ヒント
通常は、指定されたノード セット用の "既定の" アクションがあります。これは、アーキテクチャ エクスプローラーによって自動的に選択されます。 同じ振る舞いを取得するには、空のアクション (//) を使用します。
DGQL では空白は重要でないため、必要に応じてクエリを 1 行に収めるように指定できます。 これは、GraphCmd で –exec オプションを使用する場合に役立ちます。
DGQL のデバッグ時には、アーキテクチャ エクスプローラーで "Execute Expanded" アクションを使用すると、クエリの各手順を確認して、予想される結果を生成しない手順を見つけることができます。
例
次の DGQL ステートメントでは、クエリを実行します。手順の説明はステートメントの下にあります。
+ Id.Equals("Microsoft.Solution.ClassView") / "Microsoft.Solution.ClassView" / * / "Node:Both:CodeSchema_Class" / + CodeSchemaProperty_IsPublic.Equals("True")
最初に、アーキテクチャ エクスプローラーの最初の列で、クラス ビュー ノードを選択します。
"Microsoft.Solution.ClassView" アクションを実行して、ソリューション内のすべての名前空間を返します。
* を使用して、すべての名前空間を選択します。
CodeSchema_Class カテゴリを持ち、いずれかの方向を指すリンクによってそれらの名前空間に関連付けられているすべてのノードを選択します。 通常、これらはコンテインメント リンクです。
選択されたクラスをフィルター処理して、CodeSchemaProperty_IsPublic="True" プロパティを持つクラスだけを取得します。
"Microsoft.Solution.ClassView" アクションはクラス ビュー ノードの "既定の" アクションであるため、通常は必要ありません。 したがって、次に示すように、そのアクションを // に置き換えてクエリを簡略化し、クエリを 1 行に収めることができます。
+Id.Equals("Microsoft.Solution.ClassView")//*/"Node:Both:CodeSchema_Class"/+CodeSchemaProperty_IsPublic.Equals("True")
参照
処理手順
方法: グラフ ドキュメントを保存、共有、およびエクスポートする