我如何确定.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
用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将查询结果导出到调用图 )
依赖关系图如下所示:
依赖matrix看起来像:
依赖matrix事实上比graphics更不直观,但它更适合浏览复杂的代码段,如:
免责声明:我为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,因为开启后会有性能损失。
ChkAsm将一次向您显示特定程序集的所有依赖关系,包括版本,并且可以轻松地让您search列表中的程序集。 比ILSpy( http://ilspy.net/ )更适合于这个目的,这是我用来完成这个任务的。
这很有趣,我有一个类似的问题,没有find任何合适的东西,并意识到好的老Dependency Walker,所以最后我自己写了一个。
这特别涉及到.NET,并会显示程序集recursion引用(和丢失)的引用。 它也会显示本机库的依赖关系。
它是免费的(供个人使用),可以在这里find感兴趣的人: http://www.netdepends.com
反馈欢迎。
我使用的另一个方便的Reflector插件是Dependency Structure Matrix 。 看到哪些类使用什么真是太好了。 另外它是免费的。
尝试使用选项--staticlink:"Namespace.Assembly"
编译.NET程序集。 这迫使编译器在编译时拉入所有的依赖关系。 如果遇到没有引用的依赖关系,通常会给出一个警告或错误消息,以及该程序集的名称。
Namespace.Assembly
是你怀疑有依赖问题的程序集。 通常静态链接这个程序集将会传递所有的依赖关系。
我看到和使用的最好的应用程序,显示错过/有问题的dll: http : //www.dependencywalker.com/