【问题标题】:Find the "potential" cyclic reference找到“潜在的”循环参考
【发布时间】:2016-07-21 06:02:16
【问题描述】:

我们有一个大解决方案(320 个项目,250 万行代码)。

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

我完全理解什么是循环引用,并且我知道如何在小型解决方案中找到它们,但是在这里,两个项目之间没有“直接联系”(我还检查了另外一个中间项目)。

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

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

谢谢

【问题讨论】:

  • 并没有真正改变问题,但您似乎在第一段中遗漏了某种形式的乘数(让我想到一个由 300 多个项目组成的解决方案,总体而言,包含 几乎 3行代码)
  • @Damien_The_Unbeliever Ahah 完全正确,已修复

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


【解决方案1】:

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

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

确保您启用了“显示传递引用”选项,这将显示您在哪里有间接依赖关系,这可能是问题所在。

【讨论】:

  • 我刚刚意识到这是一个 Resharper 工具。如果你没有 Resharper,@user3185569 的选项应该会给你类似的观点
  • Ive resharper :) 我目前正在生成图表,我希望它可以与这么多项目一起阅读 ;) )
  • 现在,当我尝试导出到 PNG 时(因为当我尝试在其上导航时它会撞,无法使用)我得到了 0Bytes 的 PNG :()
  • 您将如何找到因阻止引用而阻止我添加另一个引用的引用?因为在我的情况下,对于所有这些项目,真的很难看到任何东西(并且 resharper 需要花费大量时间进行任何升级)。同样在我的情况下,该选项名为“显示项目依赖关系图”,是否正确?
  • 我尝试在我尝试添加引用的库上单击鼠标右键,然后单击“显示此和依赖项”。我希望在某个时候将引用视为依赖项,但目前并非如此,即使我确实检查了几个级别。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    Visual Studio 终极版解决方案:

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

    我该如何开始?

    概览您的解决方案:在架构菜单上,选择 生成依赖图,用于解决方案。你会得到一个图表,显示 顶级程序集。您现在可以通过以下方式探索这些程序集 扩展它们。将鼠标指针移到装配体顶部,然后 当它出现时选择 V 形 (^) 按钮。做同样的事情 命名空间、类型和成员,以继续探索您的代码。

    这需要 VS Ultimate 版本。

    免费替代:

    可以找到免费替代品Here

    PowerShell 替代方案:

    您可能还想对“Danny Tuppeny”的这个有趣的Power shell 脚本采取很多措施:

    页面脚本:

    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"
    

    【讨论】:

    • 不过,这确实需要 VS 的 Ultimate/Enterprise 版本。
    • @Damien_The_Unbeliever 添加了免费替代品。
    • @user3185569 谢谢你的回答,不幸的是我“只有”企业版。我想试试你的替代版本,但它似乎与 VS2015 不兼容(我收到一条错误消息,说这不适用于任何已安装的产品)。我必须获得有关 PowerShell 的更多信息,我并不真正了解它是如何工作的(我应该如何使其工作)
    • @user3185569 我刚刚测试了你的powershell脚本,由于未知原因,它停在第一级依赖关系。您提供的路径应该是所有项目所在的路径,还是我的特定项目所在的子文件夹?
    • @J4N 在 Windows 中。 Start => Run => Power shell => 复制并粘贴脚本,但将 2 个路径更改为您的本地项目路径。然后将References.txt文件结果粘贴到http://yuml.me/diagram/scruffy/class/draw
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多