Visual Studio项目的依赖关系图

时间:2009-02-28 15:08:20

标签: .net visual-studio migration graph dependencies

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

问题是我需要逐个移动项目到新的.NET框架,确保没有.NET 2.0项目引用.NET 3.5项目。有没有什么工具能给我一个很好的项目依赖图?

18 个答案:

答案 0 :(得分:138)

我需要类似的东西,但不想支付(或安装)工具来执行此操作。我created a quick PowerShell script that goes through the project references并以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"

Sample Graph

答案 1 :(得分:61)

更新: 从版本8开始,ReSharper具有内置的'View Project Dependencies'功能。

ReSharper版本< 8有Internal feature来显示使用yFiles查看器的依赖图。请参阅帖子底部的快速手册。

enter image description here

<强> HOWTO

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

答案 2 :(得分:35)

你试过NDepend吗?它将向您显示依赖项,您还可以分析类和方法的可用性。

他们的网站:

http://ndepend.com

答案 3 :(得分:30)

您可以使用Visual Studio 2010 Ultimate轻松获取项目依赖关系图,扫描到此视频的5分钟,看看如何:http://www.lovettsoftware.com/blogengine.net/post/2010/05/27/Architecture-Explorer.aspx

在Visual Studio 2010 Ultimate:架构|生成依赖关系图|通过大会。

答案 4 :(得分:17)

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

答案 5 :(得分: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建筑发现&amp;建模工具论坛:http://social.msdn.microsoft.com/Forums/en-US/vsarch/threads

答案 6 :(得分:8)

我有一个类似的问题,但它更复杂,因为有几个项目引用了同一个程序集的不同版本。

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

https://github.com/smpickett/DependencyViewer

(直接链接到github发布:https://github.com/smpickett/DependencyViewer/releases

答案 7 :(得分:5)

要完成NDepend生成的图表上的eriawan答案,请参阅下面的屏幕截图。你可以{Nntpend download and use the free trial edition一段时间。

More on NDepend Dependency Graph enter image description here

More on NDepend Dependency Matrixenter image description here

免责声明:我是工具团队的一员

答案 8 :(得分:3)

如果你只是想要一个依赖图,我发现这是获得一个最简洁的方法之一:

Dependency Analyser

答案 9 :(得分:3)

您可以在项目中创建一个很好的参考图表。我已经在我的博客http://www.mellekoning.nl/index.php/2010/03/11/project-references-in-ddd/

上描述了我的方式

答案 10 :(得分:2)

我使用YUML作为输出创建了一个小C#项目..代码可以在这里找到:

https://github.com/twistedtwig/DotnetProjectDependencyGraphs

答案 11 :(得分:2)

this article是最好的。我将它改编成了一个可以在我的机器(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

答案 12 :(得分:1)

VS 2019已将依赖关系图模块重命名为代码映射

这是官方文档:https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions?view=vs-2019

答案 13 :(得分:1)

Danny Tuppeny的PS脚本的扩展版本同时显示了项目参考和外部参考:

<!doctype html>
<html>
  <head>
    <link rel="stylesheet" href="lib/style.css">
  </head>

  <body>
    <p id="display"></p>
    <p id="startStop"></p>
    <button onclick="stopWatch()">stopWatch</button>
    <button onclick="startStop()">startStop</button>
    <button onclick="reset()">reset</button>
    <button onclick="changeColor()">changeColor</button>
  </body>
</html>

它将提供一个冒号分隔的文件,可以在Excel中打开并进行分析。

答案 14 :(得分:1)

制作powershell脚本.etc。在此处发布到dotnet工具中。

尝试DependenSee

要安装

  • 确保已安装dotnet 5运行时

  • 运行dotnet tool install dependensee --global

  • 一旦安装,运行dependensee "path/to/root/of/csproj/files" "path/to/output.html"

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

  • 要查看所有选项,请运行dependensee,且不使用参数。

HTML输出看起来像这样

DependenSee Graph

答案 15 :(得分:0)

PS Script from Danny Tuppeny的扩展版本显示了 csproj vcxproj 文件的引用,并且还支持

-深度-最大依赖链长度

-Like-仅打印以 name -like $ Like

为开头的项目的依赖链

-UntilLike-剪切名称为的项目的依赖链,例如$ UntilLike

-反向-打印反向的依赖链( [proj] <-[引用proj]

[CmdletBinding()]
param (
    [Parameter(Mandatory=$false)]
    [string]$RootFolder = ".",
    [Parameter(Mandatory=$false)]
    [string]$Like = "*",
    [Parameter(Mandatory=$false)]
    [string]$UntilLike = "*",
    [Parameter(Mandatory=$false)]
    [switch]$Reverse,
    [Parameter(Mandatory=$false)]
    [int]$Depth=1
)

$arrow = if ($script:Reverse) { "<-" } else { "->" }

Function PrintTree ($projectNameToProjectNameList, $projectName, $maxDepth = 1, $prefix = "")
{
    $print = $script:UntilLike -eq "*" -or $projectName -Like $script:UntilLike
    $stop = $projectNameToProjectNameList[$projectName].count -eq 0 -or $maxDepth -eq 0 -or ($script:UntilLike -ne "*" -and $projectName -Like $script:UntilLike)
    
    if ($stop) {
        if ($print) {
            $prefix + "[$projectName]"
        }
    } else {
        $prefix += "[$projectName] $arrow "
        --$maxDepth
        $projectNameToProjectNameList[$projectName] | % { PrintTree $projectNameToProjectNameList $_ $maxDepth $prefix }
    }
}

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

    $projectFiles | ForEach-Object {
        $projectFile = $_ | Select-Object -ExpandProperty FullName
        $projectName = $_ | Select-Object -ExpandProperty BaseName
        $projectXml = [xml](Get-Content $projectFile)
        
        $projectGuid = $projectXml | Select-Xml '//defaultNamespace:ProjectGuid' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text" | % { $_ -as [Guid] }
        $projectGuidToProjectName[$projectGuid] = $projectName

        $projectReferenceGuids = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Project' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text" | % { $_ -as [Guid] }
        if ($null -eq $projectReferenceGuids) { $projectReferenceGuids = @() }
        $projectNameToProjectReferenceGuidList[$projectName] = $projectReferenceGuids
    }

    $projectNameToProjectReferenceNameList = @{}
    foreach ($projectName in $projectNameToProjectReferenceGuidList.keys) {
        $projectNameToProjectReferenceNameList[$projectName] = $projectNameToProjectReferenceGuidList[$projectName] | % { $projectGuidToProjectName[$_] } | sort
    }
    
    if ($script:Reverse) {
        $projectReferenceNameToProjectNameList = @{}
        foreach ($projectName in $projectNameToProjectReferenceNameList.keys) {
            foreach ($projectReferenceName in $projectNameToProjectReferenceNameList[$projectName]) {
                if (!$projectReferenceNameToProjectNameList.ContainsKey($projectReferenceName)) { $projectReferenceNameToProjectNameList[$projectReferenceName] = @() } 
                $projectReferenceNameToProjectNameList[$projectReferenceName] += $projectName
            }
        }

        foreach ($projectName in $projectReferenceNameToProjectNameList.keys -Like $script:Like) {
            PrintTree $projectReferenceNameToProjectNameList $projectName $script:Depth
        }
    } else {
        foreach ($projectName in $projectNameToProjectReferenceNameList.keys -Like $script:Like) {
            PrintTree $projectNameToProjectReferenceNameList $projectName $script:Depth
        }
    }
}

Get-ProjectReferences $RootFolder

答案 16 :(得分:0)

如果您正在寻找不需要任何外部工具的方法,则可以导航到项目的obj/project.assets.json文件。该文件是在构建期间生成的,并且具有依赖项的分层JSON结构(项目引用和nuget包)。

对于回答诸如“为什么将这个项目DLL为什么拉入构建目录?”之类的问题很有用

答案 17 :(得分:-1)

我检查了所有答案,但没有一个选项令我满意,因此我编写了自己的工具来预览项目与项目之间的依赖关系。

https://github.com/Audionysos/VSProjectReferencesViewer

这是早期阶段,但可以满足我的需求:)