Visual Studio项目的依赖图


130

我目前正在将一个大型解决方案(约70个项目)从VS 2005 + .NET 2.0迁移到VS 2008 + .NET 3.5。目前,我有VS 2008 + .NET 2.0。

问题是我需要将项目一个接一个地移到新的.NET框架,以确保没有.NET 2.0项目引用.NET 3.5项目。有没有什么工具可以使我很好地了解项目依赖关系?

Answers:


39

您是否尝试过NDepend?它将向您显示依赖关系,还可以分析类和方法的可用性。

他们的网站:

http://ndepend.com


为了在2020年4月完成@Eriawan回答,已发布了NDepend 2020.1版本,并完全重建了Dependency Graph。现在,它可以扩展由数百个项目组成的大型解决方案,并提供许多导航功能。

这是NopCommerce OSS项目上的外观

NpCommerce上的NDepend依赖图

这是整个.NET Core 3类库(176个程序集)的外观。

在此处输入链接说明

免责声明:我在NDepend工作


3
原始海报没有说ndepend是免费的,它解决了这个问题。
krystan荣誉

6
在编写此答案时,它可能是免费的,但现在不是。
Levente Koncz

@ patrick-from-ndepend-team请不要直接编辑我的答案,而是打开一个新答案。
Eriawan Kusumawardhono

好吧@EriawanKusumawardhono很抱歉,如果这对您来说是个问题。这样,读者可以直接获得更多详细信息,从而提高了答案的实用性,您是否要删除多余的详细信息和屏幕截图?
来自NDepend团队的Patrick

@PatrickfromNDependteam的其他详细信息和屏幕快照都可以。但是,由于这最初是我的答案,因此您的编辑似乎使我看起来像在NDepend工作。请在编辑时添加新答案,并强调您的新答案是我的答案的补充。在此之前感谢:)
Eriawan Kusumawardhono

169

我需要类似的东西,但不想为此付费(或安装)工具。我创建了一个快速的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"

4
太棒了 我将其扩展并扩展到所有子项目,然后再次扩展以获取sln文件,而不是映射整个项目。谢谢
2014年

可以使用什么版本的Visual Studio?另外,要可视化C ++而不是C#项目,将.csproj文件后缀更改为.vcproj是否足够?在这里使用VS 2005,我得到一个空的结果文件...
ssc

1
它是针对2010年的C#项目编写的,但是您可以通过查看C ++项目中的XML并调整代码来真正轻松地对其进行调整:-)
Danny Tuppeny

5
@ssc还有的小幅更新的代码在我的博客,可能会更容易调整发布:blog.dantup.com/2012/05/...
丹尼Tuppeny

5
如果你正在使用PowerShell 2.0,您将需要追加=$trueMandatoryValueFromPipeline参数
莫莫

79

更新:ReSharper自版本8起具有内置的“查看项目依赖项”功能。

ReSharper版本<8具有内部功能,可以在使用yFiles查看器时显示依赖关系图。请参阅帖子底部的快速手册。

在此处输入图片说明

如何

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

2
还要Resharper>检查>项目层次结构,以获取当前引用的项目列表
Lu55,2015年

5
Resharper>建筑>“显示项目依赖关系图”
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功能包2,则可以对C和C ++代码执行此操作。另请参见如何:为C和C ++代码生成依赖关系图
Esther Fan-MSFT 2013年

1
试了一下,抛出了异常。显然,MS从未对它进行过几个项目以外的任何测试。我认为绝对一文不值。
C约翰逊

1
不仅如此,它还非常慢。如果可以的话,我会设为-10。我编写了自己的项目依赖项遍历器(用于我们自己的构建系统),与Visual Studio中的依赖项遍历器相比,它快如闪电。
C Johnson

@CJohnson我同意它的速度很慢,并且容易在大型解决方案中引发异常,但是总比没有好。我通过关闭所有应用程序,停止某些服务并重新启动Visual Studio使其工作。
WynandB

对我来说,大型解决方案是大约600个项目,其中包含数百万行代码。对于我来说,停止几项服务是没有可能的解决方法。
C Johnson

19

我写了一个可能对您有帮助的工具。VS解决方案依赖关系Visualizer分析解决方案中的项目依赖关系,并根据此信息以及文本报告创建依赖关系图表。


可以使用什么版本的Visual Studio和什么样的项目?VS 2005 / C ++在这里,该工具似乎没有执行任何操作……
ssc

它绝对适用于vs 2008/2010和.csproj / .vbproj。未使用vs2005进行测试,但目前无法识别.vcproj文件
devio 2013年

此工具经过分析后仅显示解决方案文件:-(。不是我的大约300个项目
。– thersch

@thersch如果您想让我看一下,请压缩.sln和项目文件(以便保留原始目录结构),将其上传到文件共享上,然后通过我的博客与我联系。thx
devio

9

我遇到了类似的问题,但是由于多个项目引用了同一程序集的不同版本,因此问题变得更加复杂。

为了获得包含版本信息并检查可能的运行时程序集加载问题的输出,我制作了此工具:

https://github.com/smpickett/DependencyViewer

(指向github发布的直接链接:https : //github.com/smpickett/DependencyViewer/releases


1
不错的工具!简单高效。感谢那!向我+1。
布卡

真的很棒的工具!我梦到这么多年了。非常感谢您的分享!
alehro 18-10-17

8

您可以在VS 2010 Ultimate中创建项目的依赖关系图。通过Architecture Explorer,您可以浏览解决方案,选择要可视化的项目和关系,然后根据选择创建依赖关系图。

有关更多信息,请参见以下主题:

如何:从代码生成图形文档http : //msdn.microsoft.com/zh-cn/library/dd409453%28VS.100%29.aspx#SeeSpecificSource

如何:使用体系结构资源管理器查找代码http : //msdn.microsoft.com/zh-cn/library/dd409431%28VS.100%29.aspx

RC下载http : //www.microsoft.com/downloads/details.aspx ? displaylang=zh_CN&FamilyID=457bab91-5eb2-4b36-b0f4- d6f34683c62a

Visual Studio 2010体系结构发现和建模工具论坛:http : //social.msdn.microsoft.com/Forums/en-US/vsarch/threads


VS 2012专业版呢?还是只有VS 2012 Ultimate?
Kiquenet

@Kiquenet您可以在VS 2012 Ultimate中创建依赖关系图。您可以在Premium和Pro中打开并进行有限的更改。
Esther Fan-MSFT 2013年


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




1

Danny Tuppeny的PS脚本的扩展版本同时显示了Project和External引用:

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中打开和分析该文件。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.