.NET DLL引用/依赖性检查实用程序

时间:2012-01-05 21:22:57

标签: .net visual-studio dependencies utilities

使用Visual Studio,我可以看到dll引用作为附图,作为示例。 有了这个参考信息,我可以打开(从示例中)Composition项目,找到所有其他引用,以获取所有引用文件名。

是否有自动执行此工作的实用程序? 我的意思是,给定一个.NET程序集,它会递归检查所有引用/依赖项,以给出DLL的名称。

我检查了cygwin的ldd和Depends.exe,但它们似乎没有显示其他项目的dll,只显示系统dll。

enter image description here

5 个答案:

答案 0 :(得分:25)

是的:ildasm.exe。它随SDK一起安装。

应该在以下路径中:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin

答案 1 :(得分:10)

我喜欢使用 AsmSpy 进行此类检查。有一个exe下载,然后我把它放到我的工具文件夹中,以方便访问。 https://github.com/mikehadlow/AsmSpy

答案 2 :(得分:4)

您可以使用提供的ildasm.exe,或者如果您想要更强大的功能,可以尝试:

Reflector

更好的是,尝试免费

dotPeek

问候,

答案 3 :(得分:1)

我不知道有任何工具可以自动执行此操作,但我可以概述任何工具(或您)必须遵循的步骤。

每个程序集都包含一个清单。清单列出了当前程序集所依赖的所有其他程序集的名称和版本。最简单的是你需要递归地跟踪这条线索。

没有正确的方法告诉您引用程序集的文件名。引用作为程序集名称(名称,版本,文化等)存储在清单中,而不是文件名。当.NET运行时需要加载引用的程序集时,它会使用各种搜索来查找它,并且这些搜索的结果可能因环境而异。当然,如果你只是在开发机器上寻找组件,这对你来说可能不是问题。

解析程序集引用的技术包括搜索已加载的任何程序集,查看全局程序集缓存,查找应用程序目录,根据应用程序配置文件或发布者策略重定向等。谷歌在MSDN中的文章“如何运行时查找程序集”了解更多详细信息。此外,您的应用程序可以通过处理System :: AppDomain :: AssemblyResolve事件来注册以执行自己的参考解析。

答案 4 :(得分:1)

此代码在查找所有引用方面做得相当不错。 "温度"将转储它追踪的所有参考文献。

    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);
            }
        }
    }