找到“潜在的”循环引用

时间:2016-07-21 06:02:17

标签: c# .net visual-studio visual-studio-2015

我们有一个很大的解决方案(320个项目,250万个LoC来提供一个想法)。

我正在尝试将项目的引用添加到另一个项目,但VS不允许我这样做,因为它意味着有一个循环引用。

我完全理解圆柱形参考是什么,我知道如何在小解决方案中找到它们,但在这里,两个项目之间没有“直接链接”(我还要检查一个中间项目)。

但要检查它已经花了我很长时间。

你会做些什么来找到暗示循环依赖的项目(或所有项目链)的整个“链”。

谢谢

3 个答案:

答案 0 :(得分:2)

查看项目依赖关系图会直观地帮助吗?

在解决方案资源管理器中右键单击您的解决方案,然后单击“查看项目依赖关系图”

确保您拥有'显示传递参考"选项已启用,这将显示您具有间接依赖关系的位置,这可能是问题所在。

答案 1 :(得分:1)

我最后通过自己的工具来查找结果。由于我在这方面花了相当多的时间,我决定发布它:https://github.com/jgrossrieder/CyclicReferenceFinder

答案 2 :(得分:0)

我认为Visual Studio团队应该为经典的循环引用错误添加更多信息。

Visual Studio Ultimate版本解决方案:

按照此MSDN article了解如何创建可视化依赖关系图,该图还可帮助您识别解决方案和依赖关系中的潜在问题。

我如何开始?

  

概述您的解决方案:在“架构”菜单上,选择   为解决方案生成依赖关系图。你会得到一张图表   顶级组件。您现在可以通过探索这些程序集   扩大它们。将鼠标指针移动到程序集顶部,然后   出现时选择V形(^)按钮。做同样的事情   名称空间,类型和成员,以继续探索您的代码。

enter image description here

这需要VS Ultimate Version。

免费替代方案:

可以找到免费替代方案Here

enter image description here

PowerShell替代方案:

您可能还想通过“Danny Tuppeny”这个有趣的Power shell脚本来解决这个问题:

enter image description here

来自页面的脚本:

function Get-ProjectReferences
{
    param(
        [Parameter(Mandatory)]
        [string]$rootFolder,
        [string[]]$excludeProjectsContaining
    )
    dir $rootFolder -Filter *.csproj -Recurse |
        # Exclude any files matching our rules
        where { $excludeProjectsContaining -notlike "*$($_.BaseName)*" } |
        Select-References
}
function Select-References
{
    param(
        [Parameter(ValueFromPipeline, Mandatory)]
        [System.IO.FileInfo]$project,
        [string[]]$excludeProjectsContaining
    )
    process
    {
        $projectName = $_.BaseName
        [xml]$projectXml = Get-Content $_.FullName
        $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }
        $projectXml |
            # Find the references xml nodes
            Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Name' -Namespace $ns |
            # Get the node values
            foreach { $_.node.InnerText } |
            # Exclude any references pointing to projects that match our rules
            where { $excludeProjectsContaining -notlike "*$_*" } |
            # Output in yuml.me format
            foreach { "[" + $projectName + "] -> [" + $_ + "]" }
    }
}
$excludedProjects = "Test1", "Test2"
Get-ProjectReferences "C:\Users\DanTup\Documents\MyProject" -excludeProjectsContaining $excludedProjects | Out-File "C:\Users\DanTup\Documents\MyProject\References.txt"