如何确定.NET应用程序的依赖? 是否Dependency Walker中使用托管应用程序的工作? 我已经下载了最新的,并试图剖析应用程序,但它只是退出没有太多的解释。 如果它不使用.NET的工作,然后有一些其他的工具,这将有助于我调试运行时加载DLL问题?
Answer 1:
Dependency Walker中工作正常的win32二进制文件。 所有的.NET的DLL和EXE的有一个小的存根头部分,这使得它们看起来像普通的二进制文件,但所有这基本上说是“加载CLR” - 所以这是所有的Dependency Walker会告诉你。
要了解哪些东西你的.NET应用程序实际上是依靠,你可以使用极大优秀的.NET反射从红门。 (编辑:请注意,.net反射现在是一个付费产品ILSpy是免费的,开源和非常相似的。)
加载你的DLL进去,点击右键,并选择“分析” - 然后你会看到一个“依赖”项,它会显示你所有其他的dll(和内这些dll的方法),它需要。
它有时可以得到棘手不过,在你的应用程序依赖于X的dll和X DLL是存在的,但无论出于何种原因无法加载或位于运行。
要解决这些类型的问题,微软有一个程序集绑定日志查看器 ,可以告诉你这是怎么回事,在运行时
Answer 2:
我发现小工具AsmSpy一个宝贵的工具,为解决与装载组件的问题。 它列出了管理组件,包括组件版本的所有组件的引用。
在的目录中的命令提示符下运行.dll
使用以下参数:
asmspy . all
用的巧克力快速安装:
choco install asmspy
Answer 3:
在ILDASM打开装配文件,查找@清单中的.assembly EXTERN
Answer 4:
要浏览.NET代码的依赖关系,您可以使用该工具NDepend的的能力。 该工具建议:
- 一个依赖图
- 一个相关矩阵 ,
- 也有一些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直接来电者的来电......)(通知还出口到图形按钮,将查询结果导出到调用图 )
依赖关系图中的样子:
相关矩阵的样子:
相关矩阵是事实上的比的图表不太直观,但它更适合于浏览的像代码复杂分段:
声明:我工作NDepend的
Answer 5:
您不需要下载和安装应用程序共享软件或工具。 您可以从programitically .NET中使用做Assembly.GetReferencedAssemblies()
Assembly.LoadFile(@"app").GetReferencedAssemblies()
Answer 6:
如果您使用的是单声道的工具链,您可以使用该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
Answer 7:
启用程序集绑定日志记录设置的注册表值EnableLog在HKLM \软件\微软\融合1。注意,你必须重新启动,使更改应用程序(使用IISRESET)有任何影响。
提示:请记住,当你完成,因为有性能上的损失已开启,关闭的融合记录。
Answer 8:
这很有趣,我也有类似的问题,并没有找到合适的任何东西,知道好老的Dependency Walker的所以最后我写了一个自己。
这本书以.NET明确,并会显示什么引用了一个装配有(和失踪)递归。 它也将展示本机库的依赖。
它是免费的(供个人使用),并可以在这里的人感兴趣的是: www.netdepends.com
反馈欢迎。
Answer 9:
http://www.amberfish.net/
ChkAsm会告诉你一次所有特定组件的依赖,包括版本,并且让你轻松搜索列表中的组件。 作品多为这个目的比ILSpy(更好http://ilspy.net/ ),这是我以前用这个任务。
Answer 10:
另一个方便的反射器插件,我使用的是依赖结构矩阵 。 这真是太棒了,看看有什么类使用什么。 加上它是免费的。
Answer 11:
尝试用选项编译.NET程序集--staticlink:"Namespace.Assembly"
。 这迫使编译器在编译时所有的依赖拉。 如果遇到的是不是引用的依赖它通常会给出一个警告或错误信息与程序集的名称。
Namespace.Assembly
是你怀疑为具有依赖性问题大会。 通常只是静态链接大会将传递地引用所有的依赖关系。
Answer 12:
最好的应用程序,我看到和使用,显示未接/问题的dll: http://www.dependencywalker.com/