如何获取应用程序使用的DLL的名称

时间:2009-08-20 09:26:20

标签: c# .net reflection

我正在寻找阅读我的应用程序使用的所有程序集(.dll)的方法。

在标准C#项目中有“References”文件夹,当它被展开时,我可以读取所有使用的库。

我的目标是以编程方式读取我的解决方案中每个项目使用的所有程序集。

最后,我想看看我编译的* .exe应用程序使用了哪些库。

6 个答案:

答案 0 :(得分:14)

你看过Assembly.GetReferencedAssemblies吗?

请注意,您不使用的任何引用都不会最终被发送到元数据中,因此您不会在执行时看到它们。

我之前已经递归地使用GetReferencedAssemblies来查找命名类型而无需指定程序集。

答案 1 :(得分:9)

要正确执行此操作,您需要遍历程序集,获取依赖项...如果您的exe需要Dll_A,并且Dll_A需要Dll_B(即使exe不引用它),那么您的exe也需要Dll_B

您可以通过反射查询(在任何装配上);它需要一些工作(特别是为了防止循环引用,确实发生;这是一个从“入口程序集”开始的示例,但这可以很容易地成为任何程序集:

    List<string> refs = new List<string>();
    Queue<AssemblyName> pending = new Queue<AssemblyName>();
    pending.Enqueue(Assembly.GetEntryAssembly().GetName());
    while(pending.Count > 0)
    {
        AssemblyName an = pending.Dequeue();
        string s = an.ToString();
        if(refs.Contains(s)) continue; // done already
        refs.Add(s);
        try
        {
            Assembly asm = Assembly.Load(an);
            if(asm != null)
            {
                foreach(AssemblyName sub in asm.GetReferencedAssemblies())
                {
                    pending.Enqueue(sub);
                }
                foreach (Type type in asm.GetTypes())
                {
                    foreach (MethodInfo method in type.GetMethods(
                        BindingFlags.Static | BindingFlags.Public |
                             BindingFlags.NonPublic))
                    {
                        DllImportAttribute attrib = (DllImportAttribute)
                            Attribute.GetCustomAttribute(method,
                                typeof(DllImportAttribute));
                        if (attrib != null && !refs.Contains(attrib.Value))
                        {
                            refs.Add(attrib.Value);
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex.Message);
        }
    }
    refs.Sort();
    foreach (string name in refs)
    {
        Console.WriteLine(name);
    }

答案 2 :(得分:3)

System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies();

foreach (System.Reflection.Assembly a in ar)
{
 Console.WriteLine("{0}", a.FullName);
}

答案 3 :(得分:1)

您可以使用AppDomain.GetAssemblies 但这将使您的应用程序中显式或隐式使用所有程序集。

答案 4 :(得分:0)

如果您有一个Assembly对象,可以在其上调用GetReferencedAssemblies()以获取程序集使用的任何引用。要获取当前运行的项目使用的程序集列表,您可以使用:

System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()

答案 5 :(得分:0)

我想你可以使用:

AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies();