Visual Studio项目的依赖关系图

159

我目前正在将一个庞大的解决方案(约70个项目)从VS 2005 + .NET 2.0迁移到VS 2008 + .NET 3.5。目前我使用的是VS 2008 + .NET 2.0。

问题在于,我需要逐个将项目移动到新的.NET框架,确保没有.NET 2.0项目引用.NET 3.5项目。有没有工具可以给我提供项目依赖关系的图形表示?

17个回答

197

我需要类似的东西,但不想为此付费(或安装)工具。我创建了一个快速的PowerShell脚本来遍历项目引用,并以yuml.me友好格式输出:

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"

5
太棒了。我将这个东西扩展到所有子项目,然后再次扩展以接受一个sln文件来映射整个项目。 - Jon
1
它是针对2010年的C#项目编写的,但是您可以通过查看C++项目中的XML并调整代码来轻松地进行微调 :-) - Danny Tuppeny
7
@ssc,我在我的博客上发布了一些稍微更新的代码,可能更容易进行调整:http://blog.dantup.com/2012/05/free-dependency-graph-generation-using-powershell-and-yuml - Danny Tuppeny
5
如果你使用的是Powershell 2.0版本,你需要在MandatoryValueFromPipeline参数后添加= $true - MoMo
1
@SirajMansour 我已经看过了,参见 http://stackoverflow.com/a/25995787/6486 - Jon
显示剩余5条评论

94
更新: 自ReSharper 8版本以来,已内置'查看项目依赖项'功能。
在ReSharper 8版本之前,有一个内部功能可使用yFiles查看器显示依赖关系图。请参见本文底部的快速手册。

enter image description here

如何操作:

  1. 这里安装yEd工具。
  2. 在命令行参数中使用/resharper.internal运行VS。
  3. 转到ReSharper/Internal/Show Dependencies。
  4. 指定要包含在“大局”中的项目。
  5. 取消选中“排除终端节点...”,除非您需要它。
  6. 按“显示”按钮。
  7. 在yEd中使用层次布局(Alt+Shift+H)。
  8. 提供反馈 =)

2
同时,可以使用Resharper > 检查 > 项目层次结构来获取当前引用的项目列表。 - Ilya Serbis
8
ReSharper > 架构 > '显示项目依赖关系图' - politus
对于一个有超过1700个项目的解决方案,ReSharper仍然会导致Visual Studio崩溃。 - Chris Weldon

51

你尝试过NDepend吗?它会展示你代码之间的依赖关系,同时还可以分析类和方法的可用性。

他们的网站:

http://ndepend.com


4
原帖并未提到nDepend是免费的,也没有说它可以解决这个问题。 - krystan honour
9
在回答撰写时可能是免费的,但现在不再是免费的了。 - Levente Koncz
1
@patrick-from-ndepend-team,请不要直接编辑我的答案,而是打开一个新的答案。 - Eriawan Kusumawardhono
3
@PatrickfromNDependteam 的额外细节和截图是可以的。但由于这原本是我的答案,你的编辑似乎让我看起来像是在 NDepend 工作。请用新答案添加你的编辑,并强调你的新答案是我的回答的补充。谢谢 :) - Eriawan Kusumawardhono
3
有趣的是看到像 NDepend 这样的商业公司劫持高票答案来推销他们的产品。惊讶的是,StackOverflow 允许这种事情发生。 - andrerav
显示剩余5条评论

45
将此处发布的powershell脚本等转换为dotnet工具。

尝试DependenSee

安装:

  • 确保已安装dotnet 5运行时

  • 确保已安装dotnet 6运行时

  • 运行dotnet tool install dependensee --global

  • 安装完成后,运行dependensee "path/to/root/of/csproj/files" "path/to/output.html"

  • 默认情况下,它不包括nuget软件包,但可以使用-P开关启用

  • 要查看所有选项,请运行不带参数的dependensee

HTML输出如下

DependenSee Graph

针对持续集成场景

有命令行选项,允许您输出XML或JSON以进行进一步处理,无论是将其写入文件还是写入标准输出,如果必要,则可以将输出传输到其他命令行工具而不触及文件系统。


2
不错的工具,简单易用,即时生效。唯一的问题是对于具有“更广泛”项目依赖关系的解决方案,图表可能会变得相当混乱,并且在某些地方箭头非常接近,以至于无法区分。 - TostMaster
3
这绝对是最简单、最实用的解决方案,如果你只是想查看项目依赖,这个方法非常适合,就像我的情况一样。干得好! - LoRdPMN
这太棒了。谢谢! - Jéf Bueno
1
我在一个包含109个项目的框架4.8 sln上使用它,效果很好。交互式HTML非常棒。 - cskwg

32

@CJohnson 如果你有Visual Studio 2010 Feature Pack 2,你可以为C和C++代码执行此操作。另请参阅如何:为C和C++代码生成依赖关系图 - Esther Fan - MSFT
1
尝试过了,抛出了异常。显然微软从未测试过它是否适用于除了一些项目之外的其他东西。依我之见,绝对是毫无价值的。 - C.J.
1
不仅如此,它还非常慢。如果可以的话,我会把评分设为-10。我编写了自己的项目依赖项检查器(用于我们自己的构建系统),与 Visual Studio 中的检查器相比,速度快得惊人。 - C.J.
@CJohnson 我同意它的速度较慢,对于大型解决方案容易抛出异常,但它仍然比没有好。我通过关闭所有应用程序、停止一些服务并重新启动Visual Studio使其正常工作。 - WynandB
对于我来说,大型解决方案包括约600个项目,数百万行代码。停止几个服务不是可接受的解决方法。 - C.J.
3
博客链接是404,这篇文章还存在其他地方吗? - ChrisW

23

我编写了一款可能会对你有所帮助的工具。VS Solution Dependency Visualizer分析解决方案中的项目依赖关系,并从这些信息创建一个依赖图表,以及一份文本报告。


这个工具适用于哪些版本的Visual Studio和哪种类型的项目?我在这里使用的是VS 2005 / C++,但这个工具似乎没有任何作用... - ssc
它绝对可以在VS 2008/2010和.csproj/.vbproj中工作。没有测试过VS2005,但目前不支持.vcproj文件。 - devio
这个工具只显示分析后的解决方案文件 :-(,而不是我的大约300个项目。 - thersch
@thersch 如果你想让我看一下,请将 .sln 和项目文件压缩成一个文件夹,以保留原始目录结构,然后上传到文件共享中,并通过我的博客联系我。谢谢。 - devio

9

1
好工具!简单高效。谢谢!我给你点赞。 - Buka
真是一个很棒的工具!我梦寐以求像这样的东西已经多年了。非常感谢你分享它! - alehro

8
你可以在VS 2010旗舰版中创建项目的依赖关系图。架构资源管理器可让您浏览解决方案,选择要可视化的项目和关系,然后从您的选择创建依赖关系图。
有关更多信息,请参见以下主题:
如何:从代码生成图形文档:http://msdn.microsoft.com/en-us/library/dd409453%28VS.100%29.aspx#SeeSpecificSource 如何:使用架构资源管理器查找代码: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架构发现和建模工具论坛: http://social.msdn.microsoft.com/Forums/en-US/vsarch/threads


VS 2012 Professional也可以吗?还是只能用VS 2012 Ultimate? - Kiquenet
@Kiquenet,你可以在VS 2012 Ultimate中创建依赖关系图。在Premium和Pro中,您可以打开并进行有限更改。 - Esther Fan - MSFT

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

5
完成eriawan关于由NDepend生成的图形的回答,可参见下面的屏幕截图。您可以下载并使用NDepend的免费试用版本一段时间。
更多关于NDepend依赖图的信息,请参见此处 NDepend Dependency Graph 更多关于NDepend依赖矩阵的信息,请参见此处NDepend Dependency Structure Matrix 免责声明:我是工具团队的一员。

NDepend是针对.NET的,它的克隆版CppDepend是针对C++的,并且可以使用.vcxproj文件。 - Patrick from NDepend team

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接