Visual Studioプロジェクトの依存関係グラフ


130

現在、大きなソリューション(約70プロジェクト)をVS 2005 + .NET 2.0からVS 2008 + .NET 3.5に移行しています。現在、VS 2008 + .NET 2.0を使用しています。

問題は、プロジェクトを1つずつ新しい.NETフレームワークに移動して、.NET 2.0プロジェクトが.NET 3.5プロジェクトを参照しないようにする必要があることです。プロジェクトの依存関係のグラフを表示するツールはありますか?

回答:


39

NDependを試しましたか?依存関係が表示され、クラスとメソッドの使いやすさを分析することもできます。

彼らのウェブサイト:

http://ndepend.com


2020年4月に@Eriawan回答を完了するために、Dependency Graphが完全に再構築されたNDependバージョン2020.1がリリースされました。現在では数百のプロジェクトで構成される大規模なソリューションに対応し、多くのナビゲーション機能を提供しています。

これがNopCommerce OSSプロジェクトでの様子です。

NopCommerceのNDepend依存関係グラフ

.NET Core 3クラスライブラリ全体(176個のアセンブリ)では、次のようになります。

ここにリンクの説明を入力

免責事項:私はNDependで働いています


3
オリジナルのポスターはndependが無料であると言っていませんでした、そしてそれは問題を解決します。
クリスタンは17:02に

6
この回答を書いている時点では無料だったかもしれませんが、現在は無料ではありません。
Levente Koncz

@ patrick-from-ndepend-team私の回答を直接編集せず、代わりに新しい回答を開いてください。
エリアワクスマワルドホノ

@EriawanKusumawardhonoに問題があれば申し訳ありません。このようにして、読者はより多くの詳細を直接取得し、これにより回答の有用性が向上します。余分な詳細とスクリーンショットを削除しますか?
NDependチームのPatrick

@PatrickfromNDependteam追加の詳細とスクリーンショットは問題ありません。しかし、これは元々私の答えなので、あなたの編集がどういうわけか私はNDependで働いているように見えます。編集して新しい回答を追加してください。また、新しい回答が私の回答に追加されていることを強調してください。前に感謝します:)
エリアワンKusumawardhono

169

私は似たようなものが必要でしたが、それを行うためのツールにお金を払う(またはインストールする)のは嫌でした。私はプロジェクトの参照通過し、代わりにyuml.me friendly-format でそれらを出力する簡単なPowerShellスクリプト作成しました

Function Get-ProjectReferences ($rootFolder)
{
    $projectFiles = Get-ChildItem $rootFolder -Filter *.csproj -Recurse
    $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }

    $projectFiles | ForEach-Object {
        $projectFile = $_ | Select-Object -ExpandProperty FullName
        $projectName = $_ | Select-Object -ExpandProperty BaseName
        $projectXml = [xml](Get-Content $projectFile)

        $projectReferences = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Name' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text"

        $projectReferences | ForEach-Object {
            "[" + $projectName + "] -> [" + $_ + "]"
        }
    }
}

Get-ProjectReferences "C:\Users\DanTup\Documents\MyProject" | Out-File "C:\Users\DanTup\Documents\MyProject\References.txt"

4
驚くばかり。私はこれを取って、すべてのサブプロジェクトを通過するように拡張し、次にプロジェクト全体をマップする代わりにslnファイルを取得するようにもう一度拡張しました。ありがとう
Jon

これはVisual Studioのどのバージョンで動作しますか?また、C#プロジェクトではなくC ++を視覚化するには、.csprojファイルのサフィックスを.vcprojに変更するだけで十分ですか?ここでVS 2005を操作すると、空の結果ファイルが表示されます...
ssc

1
これはC#の2010プロジェクトに対して作成されましたが、C ++プロジェクト内のXMLを調べてコードを調整することで、おそらく非常に簡単に調整できます:-)
Danny Tuppeny

5
:@ssc少しあり、更新のコードを微調整する方が簡単かもしれません私のブログに掲載blog.dantup.com/2012/05/...
ダニーTuppeny

5
Powershell 2.0を使用している場合は=$trueMandatoryおよびValueFromPipelineパラメータに追加する必要があります
MoMo

79

更新:バージョン8以降のReSharperには、「プロジェクトの依存関係の表示」機能が組み込まれています。

ReSharperバージョン<8には、yFilesビューアーを使用して依存関係グラフを表示する内部機能があります。投稿の下部にあるクイックマニュアルを参照してください。

ここに画像の説明を入力してください

方法

  1. ここからyEdツールをインストールします
  2. /resharper.internalコマンドライン引数を指定してVSを実行します。
  3. ReSharper / Internal / Show Dependenciesに移動します。
  4. 「全体像」に含めるプロジェクトを指定します。
  5. 必要でない場合は、[ターミナルノードを除外...]チェックボックスをオフにします。
  6. 「表示」を押します。
  7. yEdで階層レイアウトを使用する(Alt + Shift + H)
  8. フィードバックを提供する=)

2
また、Resharper> Inspect> Project Hierarchyで、現在参照しているプロジェクトのリストを取得
Lu55

5
Resharper>アーキテクチャ> 'プロジェクトの依存関係図を表示'
Dr Blowhard

32

Visual Studio 2010 Ultimateを使用してプロジェクトの依存関係グラフを簡単に取得できます。このビデオを5分間スキャンして、方法を確認してください。http//www.lovettsoftware.com/blogengine.net/post/2010/05/27/Architecture-Explorer .aspx

Visual Studio 2010 Ultimate:アーキテクチャ| 依存関係グラフを生成する| アセンブリによって。


@CJohnson Visual Studio 2010 Feature Pack 2を使用している場合は、CおよびC ++コードに対してこれを行うことができます。参照してくださいCおよびC ++コードの依存関係グラフを生成:どのように
エスターファン- MSFT

1
それを試して、例外を投げました。どうやらMSはいくつかのプロジェクト以外では何もテストしていません。私の意見では絶対に価値がありません。
Cジョンソン

1
それだけでなく、それはひどく遅いです。できればこれを-10にします。私は独自のプロジェクト依存関係ウォーカー(独自のビルドシステム用)を作成しましたが、ビジュアルスタジオのものと比べて非常に高速でした。
Cジョンソン

@CJohnson私は、それが遅く、大規模なソリューションに対して例外をスローする傾向があることに同意しますが、それでも何もないよりはましです。すべてのアプリケーションを閉じ、一部のサービスを停止し、Visual Studioを再起動することで機能しました。
WynandB 2013

私にとっての大規模なソリューションは、数百万行のコードを持つ約600のプロジェクトです。いくつかのサービスを停止することが私にとって許容できる回避策であることはありません。
Cジョンソン

19

私はあなたを助けるかもしれないツールを書きました。VS Solution Dependency Visualizerは、ソリューション内のプロジェクトの依存関係を分析し、この情報とテキストレポートから依存関係グラフを作成します。


Visual Studioのどのバージョンとどのようなプロジェクトがこれで動作しますか?VS 2005 /ここでC ++を実行しても、ツールは何も実行しないようです...
ssc

それは間違いなくvs 2008/2010および.csproj / .vbprojで動作します。vs2005ではテストしませんでしたが、現在.vcprojファイルは認識されません
devio

:-(それを分析した後、このツールが示す唯一のソリューションファイルではありません私の約300のプロジェクト。。
thersch

@therschで確認したい場合は、.slnとプロジェクトファイルを圧縮して(元のディレクトリ構造が保持されるように)、ファイル共有にアップロードして、ブログから連絡してください。thx
devio 2017

9

同様の問題がありましたが、複数のプロジェクトが同じアセンブリの異なるバージョンを参照していたため、さらに複雑になりました。

バージョン情報を含む出力を取得し、実行時のアセンブリ読み込みの問題をチェックするために、次のツールを作成しました。

https://github.com/smpickett/DependencyViewer

(githubリリースへの直接リンク:https : //github.com/smpickett/DependencyViewer/releases


1
素敵なツール!シンプルで効率的。それをありがとう!私からの+1。
ブカ

本当に素晴らしいツールです!私は何年もそのようなものを夢見ていました。共有していただきありがとうございます!
alehro 2018年

8

VS 2010 Ultimateでプロジェクトの依存関係グラフを作成できます。Architecture Explorerを使用すると、ソリューションを参照し、視覚化するプロジェクトと関係を選択して、その選択から依存関係グラフを作成できます。

詳細については、次のトピックを参照してください。

方法:コードからグラフドキュメントを生成するhttp : //msdn.microsoft.com/en-us/library/dd409453%28VS.100%29.aspx#SeeSpecificSource

方法:Architecture Explorerを使用してコードを検索するhttp : //msdn.microsoft.com/en-us/library/dd409431%28VS.100%29.aspx

RCダウンロードhttp : //www.microsoft.com/downloads/details.aspx?displaylang= en&FamilyID =457bab91-5eb2-4b36-b0f4-d6f34683c62a

Visual Studio 2010 Architectural Discovery&Modeling Toolsフォーラム:http : //social.msdn.microsoft.com/Forums/en-US/vsarch/threads


VS 2012 Professionalも?それともVS 2012 Ultimateだけですか?
Kiquenet 2013年

@Kiquenet VS 2012 Ultimateでディペンデンシーグラフを作成できます。PremiumとProを開いて制限付きの変更を行うことができます。
Estherファン-MSFT 2013年

5

NDependによって生成されたグラフでエリアワンの回答を完了するには、以下のスクリーンショットを参照してください。NDependの無料試用版ダウンロードしてしばらく使用できます

NDependディペンデンシーグラフの詳細 ここに画像の説明を入力してください

NDepend依存関係マトリックスの詳細ここに画像の説明を入力してください

免責事項:私はツールチームの一員です


NDependは.NET用であり、そのクローンCppDependはC ++用であり、.vcxprojファイルで動作します
NDependチームのPatrick

5

PowerShellのソリューションは最高です。私のマシン(TM)で動作するbashスクリプトにそれを適合させました。

#!/bin/bash

for i in `find . -type f -iname "*.csproj"`; do
    # get only filename
    project=`basename $i`

    # remove csproj extension
    project=${project%.csproj}

    references=`cat $i | grep '<ProjectReference' | cut -d "\"" -f 2`
    for ref in $references; do
        # keep only filename (assume Windows paths)
        ref=${ref##*\\}

        # remove csproj extension
        ref=${ref%.csproj}

        echo "[ $project ] -> [ $ref ]"
    done

done



3

VS 2019は依存関係グラフモジュールの名前をコードマップに変更しました

ここに公式のドキュメントがあります:https : //docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions?view=vs-2019


「コードマップを作成および編集するには、Visual Studio Enterpriseエディションが必要です。VisualStudio CommunityおよびProfessionalエディションでは、Enterpriseエディションで生成された図を開くことはできますが、編集することはできません。」
MatthewT

1

Danny TuppenyによるPSスクリプトのこの拡張バージョンは、プロジェクトと外部の両方の参照を示しています。

Function Get-ProjectReferences($rootPath)
{
  $projectFiles = Get-ChildItem $rootPath -Filter *.csproj -Recurse
  $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }

  $projectFiles | ForEach-Object {
    $projectFile = $_ | Select-Object -ExpandProperty FullName
    $projectName = $_ | Select-Object -ExpandProperty BaseName
    $projectXml = [xml](Get-Content $projectFile)

    $projectReferences = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Name' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text"
    $projectReferences | ForEach-Object {
        "PR:[" + $projectName + "]:[" + $_ + "]"
    }
  }

  $projectFiles | ForEach-Object {
    $projectFile = $_ | Select-Object -ExpandProperty FullName
    $projectName = $_ | Select-Object -ExpandProperty BaseName
    $projectXml = [xml](Get-Content $projectFile)

    $externalReferences = $projectXml | Select-Xml '//defaultNamespace:Reference/@Include' -Namespace $ns
    $externalReferences | ForEach-Object {
        "ER:[" + $projectName + "]:[" + $_ + "]"
    }

  }

}

Get-ProjectReferences "C:\projects" | Out-File "C:\temp\References.txt"

コロンで区切られたファイルが表示され、Excelで開いて分析できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.