如何确定.NET应用程序的依赖关系? Dependency Walker是否适用于托管应用?我已经下载了最新的并尝试过分析应用程序,但它只是在没有太多解释的情况下退出。如果它不能用于.NET,那么是否有其他工具可以帮助我调试运行时DLL加载问题?
答案 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
使用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)
依赖关系图如下所示:
依赖矩阵如下所示:
依赖矩阵 de-facto 不如图表那么直观,但它更适合浏览复杂的代码段,如:
免责声明:我为NDepend工作
答案 4 :(得分:6)
如果您使用的是Mono工具链,则可以使用the monodis
utility和--assemblyref
参数来列出.NET程序集的依赖关系。这适用于.exe
和.dll
个文件。
monodis --assemblyref somefile.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
$ 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
欢迎反馈。
答案 7 :(得分:2)
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/