当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何确定.NET应用程序的依赖项?》经验,为你挑选了8个好方法。

如何确定.NET应用程序的依赖项?Dependency Walker是否适用于托管应用程序?我已经下载了最新的并尝试过分析应用程序,但它只是在没有太多解释的情况下退出.如果它不能与.NET一起使用,那么是否有其他工具可以帮助我调试运行时DLL加载问题?



1> Orion Edward..:

依赖walker适用于正常的win32二进制文件.所有.NET dll和exe都有一个小的存根标题部分,使它们看起来像普通的二进制文件,但它基本上都说是"加载CLR" - 所以这就是依赖性walker会告诉你的.

要查看.NET应用程序实际依赖的内容,您可以使用Red Gate 非常出色的.NET反射器.(编辑:请注意,.NET Reflector现在是付费产品.ILSpy是免费的,开源的,非常相似.)

将DLL加载到其中,右键单击并选择"Analyze" - 然后您将看到"Depends On"项目,该项目将显示所需的所有其他dll(以及这些dll中的方法).

它有时会变得更棘手,因为你的应用程序依赖于X dll,并且存在X dll,但无论出于何种原因,无法在运行时加载或定位.

为了解决这些问题,Microsoft有一个程序集绑定日志查看器,它可以显示运行时发生的情况


请注意,截至2011年初,.NET Reflector不再免费.开源ILSpy项目非常相似.

2> Alexander va..:

我发现小型实用程序AsmSpy是解决加载程序集问题的宝贵工具.它列出了受管装配的所有装配参考,包括装配版本.

.dll具有以下参数的目录中的命令提示符中运行它:

asmspy . all

asmspy输出截图

使用Chocolatey快速安装:

choco install asmspy



3> 小智..:

在ILDASM中打开程序集文件,然后在MANIFEST中查看@assembly extern



4> Patrick from..:

要浏览.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依赖浏览C#LINQ查询

依赖关系图如下所示:

NDepend依赖图

依赖矩阵如下所示:

NDepend依赖矩阵

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

NDepend Matrix vs Graph

免责声明:我为NDepend工作


帕特里克(Patrick)可能应该提到他是该出色工具的作者;)。真的值得一试。+1即可编写!
@MitchWheat - 名字检查哈哈,"来自NDepend团队的Patrick"

5> Colonel Pani..:

您无需下载和安装共享软件应用程序或工具.您可以使用.NET从程序执行Assembly.GetReferencedAssemblies()

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


出于调试目的,通过PowerShell执行此操作更方便:`[Reflection.Assembly] :: LoadFile('C:\ absolute\path\to\my.dll').GetReferencedAssemblies()`.具有不下载或搜索模糊Windows工具位置的优点.+1
纠正我,如果我错了,但这只会给你相同的错误,你的应用程序与缺少依赖关系给出,所以不是很有用

6> Alexander O'..:

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



7> Ramesh..:

启用程序集绑定日志记录将HKLM\Software\Microsoft\Fusion中的注册表值EnableLog设置为1.请注意,必须重新启动应用程序(使用iisreset)才能使更改生效.

提示:请记住在完成后关闭融合日志记录,因为打开它会导致性能下降.



8> Lloyd..:

有趣的是,我遇到了类似的问题,没有找到合适的东西,并且意识到好老的Dependency Walker,所以最后我自己写了一个。

这专门涉及.NET,它将递归显示程序集所引用的内容(和丢失的内容)。它还将显示本机库依赖性。

它是免费的(供个人使用),有兴趣的人可以在这里找到:www.netdepends.com

欢迎反馈。

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有