如何确定.NET应用程序的依赖关系?Dependency Walker是否可以与托管应用一起使用?我已经下载了最新版本并尝试对应用程序进行性能分析,但是它只是退出而没有太多解释。如果它不适用于.NET,那么是否还有其他工具可以帮助我调试运行时DLL加载问题?
如何确定.NET应用程序的依赖关系?Dependency Walker是否可以与托管应用一起使用?我已经下载了最新版本并尝试对应用程序进行性能分析,但是它只是退出而没有太多解释。如果它不适用于.NET,那么是否还有其他工具可以帮助我调试运行时DLL加载问题?
Answers:
依赖行者适用于普通的win32二进制文件。所有.NET dll和exe都有一个小的存根标头部分,这使它们看起来像普通的二进制文件,但它基本上只说是“加载CLR”-因此,所有这些依赖项遍历者都会告诉您。
若要查看您的.NET应用程序实际依赖的东西,可以使用Red Gate 极其出色的.NET反射器。(编辑:请注意,.NET Reflector现在是付费产品。ILSpy是免费的开放源代码,并且非常相似。)
将您的DLL加载到其中,右键单击,然后选择“分析”-然后您将看到“ Depends On”项,该项目将向您显示它需要的所有其他dll(以及这些dll中的方法)。
但是有时它会变得更棘手,因为您的应用程序依赖于X dll,并且存在X dll,但是由于任何原因都无法在运行时加载或定位它。
为了解决这类问题,Microsoft提供了一个程序集绑定日志查看器,可以向您显示运行时的状况
要浏览.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表示直接呼叫者...)(另请注意使用Export to Graph按钮将查询结果导出到Call Graph)
依赖关系图如下所示:
依赖关系矩阵如下所示:
依赖关系矩阵实际上不如图形直观,但它更适合浏览复杂的代码部分,例如:
免责声明:我为NDepend工作
您无需下载并安装共享软件应用程序或工具。您可以使用.NET通过编程方式进行操作Assembly.GetReferencedAssemblies()
Assembly.LoadFile(@"app").GetReferencedAssemblies()
[Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies()
。具有不下载或搜索晦涩的Windows工具位置的好处。+1
如果使用的是Mono工具链,则可以将该monodis
实用程序与--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
有趣的是,我遇到了类似的问题,没有找到合适的东西,并且意识到好老的Dependency Walker,所以最后我自己写了一个。
这将专门处理.NET,并将递归显示程序集所引用的内容(以及缺少的内容)。它还将显示本机库依赖项。
它是免费的(供个人使用),有兴趣的人可以在这里使用:www.netdepends.com
欢迎反馈。
ChkAsm会立即向您显示特定程序集的所有依赖关系,包括版本,并让您轻松地在列表中搜索程序集。为此目的,它比ILSpy(http://ilspy.net/)更好地工作,后者是我用来完成此任务的工具。
我使用的另一个便捷的Reflector加载项是Dependency Structure Matrix。看到什么类使用什么真的很棒。另外它是免费的。
尝试使用选项编译.NET程序集--staticlink:"Namespace.Assembly"
。这迫使编译器在编译时提取所有依赖项。如果遇到未引用的依赖项,通常会以该程序集的名称给出警告或错误消息。
Namespace.Assembly
是您怀疑存在依赖性问题的程序集。通常,仅静态链接此程序集将可传递地引用所有依赖项。