如何确定 .NET 应用程序的依赖关系?
-
03-07-2019 - |
题
如何确定 .NET 应用程序的依赖关系?做 依赖步行者 使用托管应用程序?我已经下载了最新版本并尝试分析该应用程序,但它只是退出而没有太多解释。如果它不能与 .NET 一起使用,那么是否有其他工具可以帮助我调试运行时 DLL 加载问题?
解决方案
Dependency walker适用于普通的win32二进制文件。所有.NET dll和exe都有一个小的存根标题部分,使它们看起来像普通的二进制文件,但它基本上所说的只是“加载CLR”。 - 这就是所有依赖步行者会告诉你的。
要了解您的.NET应用程序实际依赖哪些内容,您可以使用非常出色的。来自红门的NET反射器。 (编辑:请注意,.NET Reflector现在是付费产品。 ILSpy 是免费的,开源的,非常相似。)
将DLL加载到其中,右键单击,然后选择“分析” - 然后您将看到“取决于”项目,它将显示它所需的所有其他dll(以及这些dll中的方法)。
它有时会变得更棘手,因为你的应用程序依赖于X dll,并且存在X dll,但无论出于何种原因都无法在运行时加载或定位。
要解决这些问题,Microsoft有一个汇编绑定日志查看器,可以显示在运行时发生的事情
其他提示
我发现小型实用程序 AsmSpy 是解决加载程序集问题的宝贵工具。它列出了托管程序集的所有程序集引用,包括程序集版本。
使用以下参数在 .dll
目录中的命令提示符下运行它:
asmspy . all
使用Chocolatey快速安装:
choco install asmspy
在ILDASM中打开程序集文件,并在MANIFEST中查看@assembly extern
要浏览 .NET 代码依赖项,您可以使用 NDepend 工具的功能。该工具建议:
- A 依赖图
- A 依赖矩阵,
- 还有一些 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 工作
您无需下载和安装共享软件应用或工具。您可以使用 <代码> Assembly.GetReferencedAssemblies()代码>
Assembly.LoadFile(@"app").GetReferencedAssemblies()
如果您使用的是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
启用程序集绑定日志记录将HKLM \ Software \ Microsoft \ Fusion中的注册表值EnableLog设置为1.请注意,必须重新启动应用程序(使用iisreset)才能使更改生效。
提示:请记住在完成后关闭融合日志记录,因为打开它会导致性能下降。
有趣的是,我遇到了类似的问题,并没有找到任何合适的东西,并且知道好的旧依赖行者,所以最后我自己写了一个。
这将专门处理.NET,并将以递归方式显示程序集具有(和缺失)的引用。它还将显示本机库依赖项。
它是免费的(供个人使用),可供任何感兴趣的人使用: www.netdepends.com
欢迎反馈。
ChkAsm将一次显示特定程序集的所有依赖项,包括版本,并且可以轻松地在列表中搜索程序集。 比ILSpy( http://ilspy.net/ )更好地用于此目的,这是我以前使用的为了这个任务。
我使用的另一个方便的Reflector加载项是依赖结构矩阵。看到哪些课程使用什么真的很棒。而且它是免费的。
尝试使用 - staticlink:&quot; Namespace.Assembly&quot;
选项编译.NET程序集。这会强制编译器在编译时引入所有依赖项。如果它遇到未引用的依赖项,它将通常使用该程序集的名称给出警告或错误消息。
Namespace.Assembly
是您怀疑存在依赖性问题的程序集。通常,只是静态链接此程序集将传递所有依赖项。
我看到和使用的最佳应用,显示错过/有问题的dll: http://www.dependencywalker.com/