.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 中的内联文档? [关闭]

csharp 与InstallUtil实用程序一起使用以使其执行某些任意代码的C#DLL示例

通过引用返回通过引用传递的向量的实用程序

Ubuntu shell 实用程序检查修改键是不是被按下

重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)