VisualStudio 项目的依赖关系图

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

问题是我需要将项目一个接一个地移到新的项目上。NET 框架,确保没有。NET 2.0项目参考资料。NET 3.5项目。有没有什么工具可以给我一个很好的项目依赖关系图?

114411 次浏览

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

他们的网站:

Http://ndepend.com

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

依赖性分析器

您可以在 VS2010Ultimate 中创建项目的依赖关系图。架构资源管理器允许您浏览解决方案,选择要可视化的项目和关系,然后从所选内容创建依赖关系图。

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

如何: 从代码生成图形文档 : < a href = “ http://msdn.microsoft.com/en-us/library/dd409453% 28VS. 100% 29.aspx # Seespecsource”rel = “ noReferrer”> http://msdn.microsoft.com/en-us/library/dd409453%28vs.100%29.aspx#seespecificsource

如何: 使用架构资源管理器查找代码 : < a href = “ http://msdn.microsoft.com/en-us/library/dd409431% 28VS. 100% 29.aspx”rel = “ norefrer”> 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架构发现与建模工具 论坛: < a href = “ http://social.msdn.microsoft.com/Forums/en-US/vsearch/thread”rel = “ noReferrer”> http://social.msdn.microsoft.com/forums/en-us/vsarch/threads

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

使用 VisualStudio2010Ultimate,您可以很容易地得到一个项目依赖关系图,扫描5分钟到这个视频,看看如何: http://www.lovettsoftware.com/blogengine.net/post/2010/05/27/Architecture-Explorer.aspx

在 Visual Studio 2010中最终: 架构 | 生成依赖关系图 | 通过汇编。

要完成由 NDepend 生成的图表的 eriawan 答案,请参见下面的截图。你可以暂时使用 NDepend 的 下载并使用免费试用版

更多关于 NDepend Dependency Graph 的信息 NDepend Dependency Graph

更多关于 NDepend Dependency Matrix 的资料 : NDepend Dependency Structure Matrix

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

我写了个工具可能会帮到你。解决方案依赖性可视化工具分析解决方案中的项目依赖关系,并根据这些信息创建依赖关系图和文本报告。

我需要类似的东西,但不想支付(或安装)一个工具来做到这一点。I 创建了一个快速的 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"

更新: ReSharper 从版本8开始就具有内置的 “查看项目依赖项”特性。

ReSharper 版本之前的8有 内部特征显示依赖关系图在使用 yFiles 查看器。请看邮件底部的快速手册。

enter image description here

怎么做

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

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

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

Https://github.com/smpickett/dependencyviewer

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

Powershell 解决方案是最好的,我把它改编成了一个 bash 脚本,可以在我的机器上使用(TM) :

#!/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

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

Https://github.com/audionysos/vsprojectreferencesviewer

虽然还处于早期阶段,但已经满足了我的需求:)

这个来自 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 中打开和分析。

这个扩展版本的 脚本来自 Danny Tuppeny显示了对 CsprojVcxproj文件的引用,并且还支持

- 深度-最大依赖链长度

- 相似-只打印从 像名字一样 $像项目开始的依赖链

- UntilLike-使用 名字一样 $直到喜欢削减项目的依赖链

- 反向打印反向依赖链([ proj ] <-[ reference 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

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

对于回答诸如“为什么这个项目 DLL 会被拉到构建目录中?”这样的问题是很有用的

制作了 Powershell 脚本等张贴到这里的一个网络工具。

试试 看看吧

安装

  • 确保已安装了 dotnet5运行时

  • 确保已安装了 dotnet6运行时

  • 运行 dotnet tool install dependensee --global

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

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

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

HTML 输出如下所示

DependenSee Graph

持续集成方案

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