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

我如何确定.NET应用程序的依赖关系? 依赖的沃克工作与托pipe的应用程序? 我已经下载了最新的,并尝试分析应用程序,但它只是退出没有太多的解释。 如果它不能与.NET一起工作,那么有没有其他工具可以帮助我debugging运行时DLL加载问题?

依赖步行者在正常的win32二进制文件上工作。 所有的.NET DLL和EXE的都有一个小的存根标题部分,使它们看起来像正常的二进制文件,但它基本上说是“加载CLR” – 所以这是所有的依赖步行者会告诉你。

要查看.NET应用程序实际依赖哪些内容,可以使用Red Gate中极其出色的.NETreflection器 。 (编辑:请注意,.NETreflection器现在是一个付费产品。ILSpy是免费的,开源的和非常相似。)

加载你的DLL,右键单击,select“分析” – 然后你会看到一个“Depends On”项目,它会告诉你所有其他的DLL(和那些DLL里面的方法),它需要。

它有时可能会变得更复杂,因为你的应用程序依赖于X DLL和X DLL的存在,但无论如何不能加载或位于运行时。

为了解决这些问题,Microsoft有一个Assembly Binding Log Viewer ,它可以显示运行时正在发生的事情

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

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

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

 asmspy . all 

asmspy输出截图

用Chocolatey快速安装它:

 choco install asmspy 

要浏览.NET代码依赖关系,可以使用NDepend工具的function。 该工具提出:

  • 依赖关系图
  • 依赖matrix ,
  • 还可以编辑(或生成)一些C#LINQ查询来浏览依赖关系。

例如,这样的查询可能看起来像:

 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代表直接调用者的调用者…)(同时注意“导出到图表”button将查询结果导出到调用图 )

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

依赖关系图如下所示:

N依赖关系图

依赖matrix看起来像:

N依赖依赖矩阵

依赖matrix事实上比graphics更不直观,但它更适合浏览复杂的代码段,如:

NDepend矩阵vs图

免责声明:我为NDepend工作

如果您正在使用Mono工具链,则可以使用带有--assemblyref参数的monodis实用程序来列出.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 

您不需要下载和安装共享软件或工具。 你可以从.NET使用Assembly.GetReferencedAssemblies()

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

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

提示:记住在完成后closures融合日志logging,因为开启后会有性能损失。

http://www.amberfish.net/

ChkAsm将一次向您显示特定程序集的所有依赖关系,包括版本,并且可以轻松地让您search列表中的程序集。 比ILSpy( http://ilspy.net/ )更适合于这个目的,这是我用来完成这个任务的。

这很有趣,我有一个类似的问题,没有find任何合适的东西,并意识到好的老Dependency Walker,所以最后我自己写了一个。

这特别涉及到.NET,并会显示程序集recursion引用(和丢失)的引用。 它也会显示本机库的依赖关系。

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

www.netdepends.com

反馈欢迎。

我使用的另一个方便的Reflector插件是Dependency Structure Matrix 。 看到哪些类使用什么真是太好了。 另外它是免费的。

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

Namespace.Assembly是你怀疑有依赖问题的程序集。 通常静态链接这个程序集将会传递所有的依赖关系。

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