145

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

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

4

17 回答 17

188

我需要类似的东西,但不想支付(或安装)工具来完成它。我创建了一个快速的 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"
于 2012-05-06T16:52:38.597 回答
85

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

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

在此处输入图像描述

如何

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

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

他们的网站:

http://ndepend.com


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

这是NopCommerce OSS 项目的样子。

NopCommerce 上的 NDepend 依赖关系图

这是整个 .NET Core 3 类库(176 个程序集)上的样子。

在此处输入链接描述

免责声明:我在 NDepend 工作

于 2009-02-28T15:12:55.553 回答
32

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

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

于 2010-07-30T20:53:42.540 回答
22

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

于 2011-03-25T07:35:18.700 回答
20

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

试试DependenSee

安装

  • 确保您已安装 dotnet 5 运行时

  • 确保您已安装 dotnet 6 运行时

  • dotnet tool install dependensee --global

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

  • 默认情况下它不包含 nuget 包,但可以通过-Pswitch启用

  • 要查看所有选项,请在dependensee不带参数的情况下运行。

HTML 输出如下所示

DependenSee 图表

对于持续集成场景

有命令行选项允许您输出 XML 或 JSON 以进行进一步处理,或者将它们写入文件或写入标准输出,从而允许将输出通过管道传输到其他命令行工具,而无需在必要时接触文件系统。

于 2020-12-03T02:32:22.237 回答
9

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

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

https://github.com/smpickett/DependencyViewer

(直接链接到 github 版本:https ://github.com/smpickett/DependencyViewer/releases )

于 2015-02-13T02:42:33.500 回答
8

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

有关详细信息,请参阅以下主题:

如何:从代码生成图形文档: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

于 2010-02-18T23:51:03.270 回答
5

要完成 NDepend 生成的图表上的 eriawan 答案,请参见下面的屏幕截图。您可以下载并使用 NDepend 的免费试用版一段时间。

更多关于 NDepend 依赖图 在此处输入图像描述

更多关于 NDepend 依赖矩阵在此处输入图像描述

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

于 2010-09-06T13:55:19.610 回答
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
于 2015-05-30T05:36:52.690 回答
4

您可以为项目中的引用创建一个漂亮的图表。我已经在我的博客http://www.mellekoning.nl/index.php/2010/03/11/project-references-in-ddd/上描述了我的做法

于 2010-03-11T21:33:59.047 回答
4

VS 2019 已将依赖图模块重命名为 Code Map

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

于 2019-10-16T09:33:52.987 回答
3

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

依赖分析器

于 2009-10-12T11:00:37.673 回答
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 中打开和分析。

于 2020-02-07T12:17:23.843 回答
0

我检查了所有答案,但没有一个选项让我满意,所以我编写了自己的工具来预览项目-项目依赖关系。

https://github.com/Audionysos/VSProjectReferencesViewer

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

于 2019-01-15T21:06:51.447 回答
0

这个来自 Danny Tuppeny 的 PS 脚本的扩展版本显示了对 csproj 和 vcxproj 文件的引用并且支持

-Depth - 最大依赖链长度

-Like - 仅打印以具有名称的项目开头的依赖链 -like $Like

-UntilLike - 削减项目的依赖链,名称为 $UntilLike

-Reverse - 打印反向的依赖链([proj] <- [referencing 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
于 2020-10-26T14:37:51.103 回答
0

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

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

于 2020-10-28T11:22:03.980 回答