Как получить имена DLL, используемые приложением

Я ищу способ прочитать все сборки (DLL), используемые моим приложением.

В стандартном проекте С# есть папка "Ссылки", когда она расширяется, я могу читать все используемые библиотеки.

Моя цель - программно прочитать все сборки, которые используются каждым проектом в моем решении.

Наконец, я хотел бы посмотреть, какие библиотеки используются моим скомпилированным *.exe-приложением.

Ответ 1

Вы посмотрели Assembly.GetReferencedAssemblies?

Обратите внимание, что любые ссылки, которые вы не используете, не будут переданы в метаданные, поэтому вы не увидите их во время выполнения.

Я использовал GetReferencedAssemblies рекурсивно до сих пор, чтобы найти именованный тип без указания сборки.

Ответ 2

Чтобы сделать это правильно, вам нужно пройти сборки, подобрав зависимости... если вашему 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);
    }

Ответ 3

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

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

Ответ 4

Вы можете использовать AppDomain.GetAssemblies.
Но это даст ВСЕ сборки, используемые явно или неявно в вашем приложении.

Ответ 5

Если у вас есть объект Assembly, вы можете вызвать GetReferencedAssemblies() на нем, чтобы получить ссылки, которые использует эта сборка. Чтобы получить список сборок, которые использует текущий проект, вы можете использовать:

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

Ответ 6

Я думаю, вы можете использовать:

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