.NET DLL 引用/依赖检查实用程序
Posted
技术标签:
【中文标题】.NET DLL 引用/依赖检查实用程序【英文标题】:.NET DLL references/dependency checking utility 【发布时间】:2012-02-03 17:18:20 【问题描述】:使用 Visual Studio,我可以将 dll 引用作为附件图片作为示例。 使用此参考信息,我可以打开(来自示例)组合项目以查找所有其他参考并继续获取所有参考文件名。
是否有任何实用程序可以自动完成这项工作? 我的意思是,给定一个 .NET 程序集,它会递归检查所有引用/依赖项以给出 DLL 的名称。
我检查了 cygwin 的 ldd 和 Depends.exe,但它们似乎没有显示来自其他项目的 dll,而只有系统 dll。
【问题讨论】:
您可以使用 Assembly.GetReferencedAssemblies() 轻松编写一个。从 EXE 开始。当然,您需要能够找到程序集文件,因为 .config 文件和发布者政策可能会变得非常麻烦。它不是通用实用程序的原因。 相关帖子 - Where does Visual Studio is referring the actual NuGet referenced DLL? 【参考方案1】:是的:ildasm.exe。它与 SDK 一起安装。
应位于如下路径:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
【讨论】:
但它只显示本机 exern dll。如何查看 .net 引用的程序集? 如果双击 Manifest,它会显示 .net 引用的程序集: .assembly extern System.Drawing .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_ ....: .ver 4:0:0:0 .assembly extern System.Data .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0 :0:0 是的..我对***.com/questions/18637173/…感到困惑【参考方案2】:我喜欢使用 AsmSpy 进行此类检查。有一个exe要下载,然后我把它放到我的工具文件夹中以便于访问。 https://github.com/mikehadlow/AsmSpy
【讨论】:
+1 AsmSpy 可以生成(通过使用 -dg 键)*.dgml 格式的输出文件,可以使用 Visual Studio 2013 或 2015 打开。在 VS 中打开时,您可以搜索它 (Ctrl-F) 以找到感兴趣的 dll(例如丢失的 dll)。按“I”选择所有依赖它的 dll。然后 R-单击图形/选择/反转选择,按键盘上的 Delete 键 - 您可以获得一个很好的可读 dll 图形,该图形依赖于丢失的 dll。 dotPeek 和 ILSpy(Reflector 的继承者)都无法生成可搜索格式的依赖项列表。【参考方案3】:您可以使用提供的 ildasm.exe,或者如果您想要更强大的东西,您可以尝试:
Reflector
更好的是,试试免费:
dotPeek
【讨论】:
【参考方案4】:我不知道有任何工具可以自动为您执行此操作,但我可以概述任何工具(或您)必须遵循的步骤。
每个程序集都包含一个清单。清单列出了当前程序集所依赖的所有其他程序集的名称和版本。在最简单的情况下,您需要递归地跟踪这条路径。
没有正确的方法可以告诉您所引用程序集的文件名。引用作为程序集名称(名称、版本、文化等)而不是文件名存储在清单中。当 .NET 运行时需要加载引用的程序集时,它会使用各种搜索来查找它,并且这些搜索的结果可能因环境而异。当然,例如,如果您只是在开发机器上寻找程序集,这对您来说可能不是问题。
解决程序集引用的技术包括搜索任何已加载的程序集、查看全局程序集缓存、查看应用程序目录、基于应用程序配置文件或发布者策略的重定向等。谷歌获取 MSDN 中的文章“运行时如何定位程序集”以获取更多详细信息。此外,您的应用程序可以注册以通过处理 System::AppDomain::AssemblyResolve 事件来进行自己的引用解析。
【讨论】:
【参考方案5】:这段代码在查找所有引用方面做得相当好。 “temp”将是它跟踪的所有引用的转储。
private void PerformReferenceAnalysis()
StringBuilder builder = new StringBuilder();
HashSet<string> loadedAssemblies = new HashSet<string>();
PerformReferenceAnalysis(System.Reflection.Assembly.GetExecutingAssembly(), builder, string.Empty, loadedAssemblies);
string temp = builder.ToString();
private void PerformReferenceAnalysis(System.Reflection.Assembly assembly, StringBuilder builder, string leadingWhitespace, HashSet<string> loadedAssemblies)
if (builder.Length > 0)
builder.AppendLine();
builder.Append(leadingWhitespace + assembly.FullName);
System.Reflection.AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies();
foreach (System.Reflection.AssemblyName assemblyName in referencedAssemblies)
if (loadedAssemblies.Contains(assemblyName.Name))
continue;
loadedAssemblies.Add(assemblyName.Name);
System.Reflection.Assembly nextAssembly;
try
nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.FullName);
catch (Exception)
try
nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.Name);
catch (Exception)
nextAssembly = null;
if (nextAssembly != null)
PerformReferenceAnalysis(nextAssembly, builder, leadingWhitespace + "| ", loadedAssemblies);
【讨论】:
以上是关于.NET DLL 引用/依赖检查实用程序的主要内容,如果未能解决你的问题,请参考以下文章
为 ASP Classic 中的 COM 可见性注册 .NET DLL
FxCop 或其他实用程序需要 VB.NET 中的内联文档? [关闭]