如何确定.NET 应用程序的依赖项?

如何确定。NET 应用程序?依赖 Walker与托管应用程序一起工作吗?我已经下载了最新版本,并尝试分析这个应用程序,但它只是退出,没有多少解释。如果它不工作。NET,那么是否有其他工具,可以帮助我调试一个运行时 DLL 加载问题?

167412 次浏览

依赖性 Walker 在普通的 win32二进制文件上工作。全部。NET dll 和 exe 有一个很小的存根头部分,使它们看起来像普通的二进制文件,但它基本上说的是“加载 CLR”-所以这就是依赖性沃克会告诉你的全部。

看看哪些东西。NET 应用程序实际上所依赖的,你可以使用非常优秀的 .NET 反射器从红门。(编辑: 注意。NET 反射器现在是一个付费产品。ILSpy是免费的、开源的,而且非常相似。)

加载你的 DLL,右键点击,然后选择“分析”-你会看到一个“依赖”项目,它会显示你所需要的所有其他 DLL 的(和这些 DLL 的内部方法)。

但是有时候它会变得更棘手,因为你的应用程序依赖于 X dll,并且 X dll 存在,但是由于某种原因不能在运行时加载或定位。

为了解决这类问题,微软有一个 程序集绑定日志查看器,它可以向您显示 在运行时上发生了什么

启用程序集绑定日志记录将 HKLM Software Microsoft Fusion 中的注册表值 EnableLog 设置为1。注意,要使更改产生任何效果,必须重新启动应用程序(使用 iisreset)。

提示: 记住在完成融合日志记录时关闭它,因为打开它会带来性能损失。

要浏览.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表示直接调用者...)(还注意 Export to Graph 按钮将查询结果导出到 打给 Graph)

NDepend dependencies browsing through C# LINQ query

依赖关系图看起来像这样:

NDepend Dependency Graph

依赖矩阵是这样的:

NDepend Dependency Matrix

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

NDepend Matrix vs Graph

免责声明: 我为 NDepend 工作

在 ILDASM 中打开汇编文件,在 MANIFEST 中查看@the. Assembly 外部文件

如果使用 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

Http://www.amberfish.net/

ChkAsm 将一次显示特定程序集的所有依赖项,包括版本,并且可以轻松地在列表中搜索程序集。 与 ILSpy (http://ilspy.net/)相比,ILSpy 在这方面的工作效果要好得多,我过去就是用它来完成这项任务的。

您不需要下载和安装共享软件应用程序或工具

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

有趣的是,我有一个类似的问题,没有找到任何合适的,并知道良好的老依赖沃克,所以最后我自己写了一个。

这件事。NET,并将递归地显示程序集具有(和缺少)哪些引用。它还将显示本机库依赖项。

它是免费的(供个人使用) ,任何感兴趣的人都可以使用 给你

2

欢迎反馈。

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

.dll目录的命令提示符下运行它,参数如下:

asmspy . all

asmspy output screenshot

用 Chocolatey 快速安装:

choco install asmspy

尝试编译您的。NET 程序集,选项为 --staticlink:"Namespace.Assembly"。这将强制编译器在编译时引入所有依赖项。如果遇到未引用的依赖项,它通常会提供一个警告或错误消息,其中包含该程序集的名称。

Namespace.Assembly是您怀疑有依赖性问题的程序集。通常只需静态链接此程序集就可以传递地引用所有依赖项。

提供更新.Net 版本的解决方案

当 OP 提出这个问题时,情况可能并非如此,但是目前有一个内置的 dotnet命令用于列出解决方案中的包依赖项:

    PS C:\foo> dotnet list package
Project 'foo' has the following package references
[net5.0]:
Top-level Package               Requested    Resolved
...                             ...          ...

更多信息可以在 Microsoft 文档网站上找到: https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-list-package

在我的公司,我们使用阿舒托什 Bhawasinka 的“装配信息”。它是作为 shell 扩展实现的,所以您只需右键单击 * 。Dll 文件,你得到的信息。您可以看到一个依赖关系树或获取所有依赖关系的平面列表。我喜欢这个工具的地方在于它还显示了公钥令牌,这是检查冲突的好方法。下面是我公司的一个程序集的平面列表输出示例:

ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=484f84ea1d6cf4da
mscorlib, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

我们收集了。Net Framework 4.0,所以您可以看到在 mscolib 上的版本; 我们还引用了 SharpZipLib,它是为。Net Framework 2.0,因此我们也看到了这种依赖性。不错嘛。

唯一的问题是该实用程序被发布在 CodePlex 上,而 CodePlex 已被关闭。谢天谢地,我们保留了原始文件的副本。我在网上其他地方找不到它,所以我决定把它贴在这里,任何人都可以得到一份(看起来我们只保存了64位版本) :

Http://riosoftware.com/temp/pub/assembly%20information%20for%2064bit%20operating%20system.zip