如何确定 .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 工具的功能。该工具建议:

例如,这样的查询可以如下所示:

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 dependencies browsing through C# LINQ query

依赖图如下所示:

NDepend Dependency Graph

依赖矩阵如下所示:

NDepend Dependency Matrix

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

NDepend Matrix vs Graph

免责声明:我为 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

欢迎反馈。

http://www.amberfish.net/

ChkAsm将一次显示特定程序集的所有依赖项,包括版本,并且可以轻松地在列表中搜索程序集。 比ILSpy( http://ilspy.net/ )更好地用于此目的,这是我以前使用的为了这个任务。

我使用的另一个方便的Reflector加载项是依赖结构矩阵。看到哪些课程使用什么真的很棒。而且它是免费的。

尝试使用 - staticlink:&quot; Namespace.Assembly&quot; 选项编译.NET程序集。这会强制编译器在编译时引入所有依赖项。如果它遇到未引用的依赖项,它将通常使用该程序集的名称给出警告或错误消息。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top