【发布时间】:2012-03-04 23:16:14
【问题描述】:
我开始在一个新项目中工作,在一个解决方案中包含大量程序集。 我还不熟悉程序集依赖项,并且很难弄清楚哪个程序集依赖于另一个程序集。
您知道任何能够显示依赖关系列表或更好的可视化图表的工具吗?
任何帮助表示赞赏!
【问题讨论】:
标签: .net assemblies
我开始在一个新项目中工作,在一个解决方案中包含大量程序集。 我还不熟悉程序集依赖项,并且很难弄清楚哪个程序集依赖于另一个程序集。
您知道任何能够显示依赖关系列表或更好的可视化图表的工具吗?
任何帮助表示赞赏!
【问题讨论】:
标签: .net assemblies
这里有一些快速代码来展示 Cecil Library 的情况:
public static void PoC(IEnumerable<AssemblyDefinition> assemblies, TextWriter writer)
{
Console.WriteLine("digraph Dependencies {");
var loaded = assemblies
.SelectMany(a => a.Modules.Cast<ModuleDefinition>())
.SelectMany(m => m.AssemblyReferences.Cast<AssemblyNameReference>().Select(a => a.Name + ".dll"))
.Distinct()
.Select(dllname => {
try { return AssemblyFactory.GetAssembly(dllname); }
catch { return null; } })
.Where(assembly => assembly != null)
.ToList();
loaded.ForEach(a => a.MainModule.FullLoad());
loaded.ForEach(a =>
{
foreach (var r in a.MainModule.AssemblyReferences.Cast<AssemblyNameReference>())
Console.WriteLine(@"""{0}"" -> ""{1}"";", r.Name, a.Name.Name);
} );
Console.WriteLine("}");
}
它会生成一个dot graph file。在一个相当简单的项目上运行它会导致:
在一个稍微不那么简单的项目上运行它会返回:
建议过滤掉某些程序集 (.StartsWith("System.")?) 和/或限制搜索深度等。
【讨论】:
NDepend 是依赖图分析的王者。该工具提出:
查看此Stackoverflow answer 中有关相关问题的所有详细信息。
【讨论】: