工具展示程序集依赖关系

11

我开始参与一个包含许多程序集的新项目,它们都在同一个解决方案中。 我还不熟悉程序集之间的依赖关系,很难弄清楚哪个程序集依赖于另一个程序集。

您是否知道有哪些工具可以显示程序集之间的依赖关系列表或更好的可视化图形呢?

非常感谢任何帮助!

2个回答

17

这是一个快速的代码示例,展示如何使用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图形文件。在一个相当简单的项目上运行它会产生以下结果:

enter image description here

在一个稍微复杂一些的项目上运行它会返回以下结果:

enter image description here

建议过滤掉某些程序集(例如.StartsWith("System."))并/或限制搜索深度等。


太棒了!(你应该将代码更新到Cecil .9,这样就不用再使用Cast<>()了。) - Jb Evain
@JbEvain:我落后于更新。 Cecil 在许多时候为我提供了很好的服务,但我几乎没有足够的时间编写我的工具。感谢你的赞美之词(@others:JbE 是 Cecil 的作者,这个令人惊叹的库使这一切变得轻松)。 - sehe
1
看起来很不错,但由于我们公司已经在使用NDepend,这对我来说是更快更有效的方式,感谢您详细的解释! - SvenG
@SvenG:咦/惊讶。你已经有NDepend了吗?我完全不明白为什么现在才问这个问题。 - sehe
我们最近购买了它,但我还没有开始使用,因为我不太熟悉它,也没有时间去研究它的所有功能。我们将来会接受有关它的培训,但目前有太多繁忙的项目正在进行中。 - SvenG
显示剩余2条评论

7

1
感谢所有的建议。我们已经在使用NDepend进行代码度量/代码质量检查,但是直到现在我才意识到它还可以创建代码依赖图。我已经测试过了,它的表现非常好。这正是我所需要的!!! - SvenG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,