如何确定.NET应用程序的依赖项?

时间:2008-10-22 23:18:43

标签: .net dll dependencies dependency-walker

如何确定.NET应用程序的依赖关系? Dependency Walker是否适用于托管应用?我已经下载了最新的并尝试过分析应用程序,但它只是在没有太多解释的情况下退出。如果它不能用于.NET,那么是否有其他工具可以帮助我调试运行时DLL加载问题?

11 个答案:

答案 0 :(得分:85)

Dependency walker适用于普通的win32二进制文件。所有.NET dll和exe都有一个小的存根标题部分,使它们看起来像普通的二进制文件,但它基本上都说是“加载CLR” - 所以这就是依赖步行者会告诉你的。

要了解.NET应用程序实际依赖哪些内容,您可以使用Red Gate中非常出色的.NET reflector。 (编辑:请注意,.NET Reflector现在是付费产品。ILSpy是免费且开源的,非常相似。)

将DLL加载到其中,右键单击,然后选择“Analyze” - 然后您将看到“Depends On”项目,该项目将显示所需的所有其他dll(以及这些dll中的方法)。

它有时会变得更棘手,因为你的应用程序依赖于X dll,并且存在X dll,但无论出于何种原因都无法在运行时加载或定位。

要解决这些问题,Microsoft有Assembly Binding Log Viewer可以向您显示在运行时发生的事情

答案 1 :(得分:39)

我发现小实用程序AsmSpy是解决加载程序集问题的宝贵工具。它列出了托管程序集的所有程序集引用,包括程序集版本。

使用以下参数在.dll目录的命令提示符中运行它:

asmspy . all

asmspy output screenshot

使用Chocolatey快速安装:

choco install asmspy

答案 2 :(得分:25)

在ILDASM中打开程序集文件,并在MANIFEST中查看@assembly extern

答案 3 :(得分:17)

要浏览.NET代码依赖项,可以使用NDepend工具的功能。该工具提出:

例如,此类查询可能如下所示:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

其结果如下:(请注意代码指标深度,1表示直接呼叫者,2表示直接呼叫者的呼叫者...)(另请注意导出到图表按钮以导出查询结果为Call Graph

NDepend dependencies browsing through C# LINQ query

依赖关系图如下所示:

NDepend Dependency Graph

依赖矩阵如下所示:

NDepend Dependency Matrix

依赖矩阵 de-facto 不如图表那么直观,但它更适合浏览复杂的代码段,如:

NDepend Matrix vs Graph

免责声明:我为NDepend工作

答案 4 :(得分:6)

如果您使用的是Mono工具链,则可以使用the monodis utility--assemblyref参数来列出.NET程序集的依赖关系。这适用于.exe.dll个文件。

用法示例:

monodis --assemblyref somefile.exe

示例输出(.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

示例输出(.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

答案 5 :(得分:5)

启用程序集绑定日志记录将HKLM \ Software \ Microsoft \ Fusion中的注册表值EnableLog设置为1.请注意,必须重新启动应用程序(使用iisreset)才能使更改生效。

提示:请记住在完成后关闭融合日志记录,因为打开它会导致性能下降。

答案 6 :(得分:5)

有趣的是,我遇到了类似的问题,并没有找到任何合适的东西,并且知道好的旧依赖行者,所以最后我自己写了一个。

这将专门处理.NET,并将以递归方式显示程序集具有(和缺失)的引用。它还将显示本机库依赖项。

它是免费的(供个人使用),可供任何感兴趣的人使用:www.netdepends.com

www.netdepends.com

欢迎反馈。

答案 7 :(得分:2)

http://www.amberfish.net/

ChkAsm将一次显示特定程序集的所有依赖项,包括版本,并且可以轻松地在列表中搜索程序集。 为此目的比ILSpy(http://ilspy.net/)更好地工作,这是我以前用于此任务的。

答案 8 :(得分:0)

我使用的另一个方便的Reflector加载项是Dependency Structure Matrix。看到哪些课程使用什么真的很棒。而且它是免费的。

答案 9 :(得分:0)

尝试使用选项--staticlink:"Namespace.Assembly"编译.NET程序集。这会强制编译器在编译时引入所有依赖项。如果它遇到未被引用的依赖项,它将通常使用该程序集的名称给出警告或错误消息。

Namespace.Assembly是您怀疑存在依赖性问题的程序集。通常,只是静态链接此程序集将传递所有依赖项。

答案 10 :(得分:-3)

我看到和使用的最佳应用,显示错过/有问题的dll: http://www.dependencywalker.com/