我们有一个很大的解决方案(320个项目,250万个LoC来提供一个想法)。
我正在尝试将项目的引用添加到另一个项目,但VS不允许我这样做,因为它意味着有一个循环引用。
我完全理解圆柱形参考是什么,我知道如何在小解决方案中找到它们,但在这里,两个项目之间没有“直接链接”(我还要检查一个中间项目)。
但要检查它已经花了我很长时间。
你会做些什么来找到暗示循环依赖的项目(或所有项目链)的整个“链”。
谢谢
答案 0 :(得分:2)
查看项目依赖关系图会直观地帮助吗?
在解决方案资源管理器中右键单击您的解决方案,然后单击“查看项目依赖关系图”
确保您拥有'显示传递参考"选项已启用,这将显示您具有间接依赖关系的位置,这可能是问题所在。
答案 1 :(得分:1)
我最后通过自己的工具来查找结果。由于我在这方面花了相当多的时间,我决定发布它:https://github.com/jgrossrieder/CyclicReferenceFinder
答案 2 :(得分:0)
我认为Visual Studio团队应该为经典的循环引用错误添加更多信息。
按照此MSDN article了解如何创建可视化依赖关系图,该图还可帮助您识别解决方案和依赖关系中的潜在问题。
概述您的解决方案:在“架构”菜单上,选择 为解决方案生成依赖关系图。你会得到一张图表 顶级组件。您现在可以通过探索这些程序集 扩大它们。将鼠标指针移动到程序集顶部,然后 出现时选择V形(^)按钮。做同样的事情 名称空间,类型和成员,以继续探索您的代码。
这需要VS Ultimate Version。
可以找到免费替代方案Here
您可能还想通过“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"