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


106

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

Answers:


94

依赖行者适用于普通的win32二进制文件。所有.NET dll和exe都有一个小的存根标头部分,这使它们看起来像普通的二进制文件,但它基本上只说是“加载CLR”-因此,所有这些依赖项遍历者都会告诉您。

若要查看您的.NET应用程序实际依赖的东西,可以使用Red Gate 极其出色的.NET反射器。(编辑:请注意,.NET Reflector现在是付费产品。ILSpy是免费的开放源代码,并且非常相似。)

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

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

为了解决这类问题,Microsoft提供了一个程序集绑定日志查看器,可以向您显示运行时的状况


我认为您错过了该URL的一部分-.aspx被放置在链接文本中。我设法找到了。
布赖恩·斯图尔特

哦...是的,降价控件在URL的右括号中占据了位置,不幸的是MSDN在所有的URL中都使用了(VS80):-(
Orion Edwards

44
请注意,从2011年初开始,.NET Reflector不再免费。开源的ILSpy项目非常相似。
yoyo

1
程序集绑定日志视图v4.0.30319.1完全不可用。日志条目未按时间顺序显示,您无法对其进行排序。它显示的路径不适合查看器,您无法调整其大小。这完全是浪费时间。
中微子

dependencywalker.com您应该包括您提到的内容的网址,尤其是。如果他们工作。
toddmo

54

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

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

asmspy . all

asmspy输出屏幕截图

用Chocolatey快速安装:

choco install asmspy

它可以在C#文件或Razor视图上使用吗?我正在通过在运行时从mvc项目中导出一些视图和控制器来创建子项目。而且我想知道这些Views和控制器需要什么依赖关系,以便我可以在运行时复制这些依赖关系,以使子项目可以作为IIS上的单独Web项目发布。
Rupendra

25

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


1
我也可以通过这种方式查看相关程序集的版本吗?我只看到依赖项名称,而不是它的版本。
Michael R

实际上,是的,我也可以通过单击“ MANIFES T”
迈克尔·R)

1
我更喜欢这一点-如果您在开发环境中工作,则无需下载任何其他实用程序
Dan Field,

调试第三方应用程序崩溃时,如何仅在ildasm的客户上安装?
realtebo

18

要浏览.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

通过C#LINQ查询浏览的NDepend依赖项

依赖关系图如下所示:

NDepend依赖图

依赖关系矩阵如下所示:

NDepend依赖矩阵

依赖关系矩阵实际上不如图​​形直观,但它更适合浏览复杂的代码部分,例如:

NDepend矩阵与图

免责声明:我为NDepend工作


2
帕特里克(Patrick)可能应该提到他是该出色工具的作者;)。真的值得一试。+1即可写作!
米奇·麦特

1
嘿,我自己才注意到这一点。我喜欢阅读他的博客文章-我必须尝试NDepend!
布赖恩·斯图尔特

2
@MitchWheat-名字签出了哈哈,“来自NDepend团队的帕特里克”
kayleeFrye_onDeck 17-4-27的

我可以与VStudio一起使用吗?要在
非我的

16

您无需下载并安装共享软件应用程序或工具。您可以使用.NET通过编程方式进行操作Assembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

9
出于调试目的,通过PowerShell:这样做更方便[Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies()。具有不下载或搜索晦涩的Windows工具位置的好处。+1
jpmc26年

3
如果我错了,请纠正我,但是这只会给您与缺少依赖项的应用程序相同的错误,因此它不是很有用
jk。

仅当程序集加载到AppDomain中时,此方法才有效。为反射加载的装配体返回空集。
戴维·A·格雷,

7

如果使用的是Mono工具链,则可以将该monodis实用程序--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

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

提示:完成操作后,请记住关闭融合日志记录,因为启用它会降低性能。


5

有趣的是,我遇到了类似的问题,没有找到合适的东西,并且意识到好老的Dependency Walker,所以最后我自己写了一个。

这将专门处理.NET,并将递归显示程序集所引用的内容(以及缺少的内容)。它还将显示本机库依赖项。

它是免费的(供个人使用),有兴趣的人可以在这里使用:www.netdepends.com

www.netdepends.com

欢迎反馈。


请添加对打开装配的拖放支持。如果可以使用XCOPY部署以及源代码,那也很好。
gigaplex 2015年

我只是注意到,该网站没有明显的链接到该部分,其中有两个版本,免费的一个用于非商业用途。我不小心偶然发现了“帮助”菜单中的“升级到专业版”选项。在下载页面上应该有一个通知,指出它不是免费用于商业用途。
gigaplex 2015年

@gigaplex我会注意到这两个感谢,我会看看我能做什么。
劳埃德

1
Shiftclick打开一棵树,所有子项目也将很有用。
TS

1
如何告知我缺少的依赖项?
realtebo

2

http://www.amberfish.net/

ChkAsm会立即向您显示特定程序集的所有依赖关系,包括版本,并让您轻松地在列表中搜索程序集。为此目的,它比ILSpy(http://ilspy.net/)更好地工作,后者是我用来完成此任务的工具。


1
截至2019年,该站点似乎是某种粗略的博客...
McGuireV10

@ McGuireV10就是这样。那真不幸。一个快速的谷歌不再出现该应用程序的点击量。
mhenry1384


0

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.