代码之家  ›  专栏  ›  技术社区  ›  Migol

Visual Studio项目的依赖关系图

  •  157
  • Migol  · 技术社区  · 17 年前

    17 回复  |  直到 17 年前
        1
  •  187
  •   Uwe Keim    6 年前

    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"
    
        2
  •  85
  •   Evgeniy Berezovsky    11 年前

    更新: 'View Project Dependencies'

    Internal feature

    enter image description here

    1. 从以下位置安装yEd工具 here .
    2. 指定要包含在“全局”中的项目。
    3. 取消选中“排除终端节点”。“除非你需要它。
    4. 按“显示”。
    5. 在yEd中使用分层布局(Alt+Shift+H)
    6. 提供反馈=)
        3
  •  49
  •   Patrick from NDepend team    6 年前

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

    他们的网站:

    http://ndepend.com

        4
  •  32
  •   Richard    15 年前

    尝试 DependenSee

    安装

    • 请确保您已安装.NET 5运行时环境

    • 请确保您已安装.NET 6运行时环境

    • dotnet tool install dependensee --global

    • dependensee "path/to/root/of/csproj/files" "path/to/output.html"

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

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

    HTML输出如下

    DependenSee Graph

    对于持续集成场景

        5
  •  22
  •   devio    15 年前

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

        6
  •  9
  •   Pickett    9 年前

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

        7
  •  8
  •   Esther Fan - MSFT    16 年前

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

    https://github.com/smpickett/DependencyViewer

    https://github.com/smpickett/DependencyViewer/releases )

        8
  •  8
  •   Dharman vijay    5 年前

    您可以在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

    : 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

        9
  •  5
  •   Patrick from NDepend team    14 年前

    Powershell solution

    #!/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
    
        10
  •  5
  •   Community Mohan Dere    9 年前

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

    More on NDepend Dependency Graph NDepend Dependency Graph

    More on NDepend Dependency Matrix : NDepend Dependency Structure Matrix

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

        12
  •  4
  •   Steven J    6 年前
        14
  •  1
  •   Svein Terje Gaup    6 年前

    obj/project.assets.json

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

        15
  •  0
  •   Paweł Audionysos    7 年前

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

    https://github.com/Audionysos/VSProjectReferencesViewer

        16
  •  0
  •   Ilyan    5 年前

    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"
    

        17
  •  0
  •   Will    5 年前

    此扩展版本 PS Script from Danny Tuppeny 显示了两者的参考文献 项目文件 vcxproj

    -深度-最大依赖链长度

    -Like-只打印从以下项目开始的依赖链

    name-like$UntilLike

    -反向-打印反向依赖链( )

    [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