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

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

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

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

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

Ответы на вопрос(6)

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

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

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

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

 Maciej20 авг. 2009 г., 11:52
Спасибо за ваш совет! Этот AppDomain.CurrentDomain.GetAssemblies () также был интересным
 Jon Skeet20 авг. 2009 г., 11:32
Насколько я понимаю, это даст те, которые уже были загружены. Могут быть те, на которые есть ссылки в метаданных, но которые еще не загружены, поскольку они пока не нужны при выполнении.

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

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

вам нужно пройтись по сборкам, подобрав зависимости ... если вашему 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);
    }
 Matt Warren21 авг. 2009 г., 10:15
Спасибо за это Марк
 Marc Gravell♦20 авг. 2009 г., 21:36
Обновлено, чтобы показать PInvoke dlls
 Marc Gravell♦20 авг. 2009 г., 16:18
Управляемые dll только. Вы можете использовать отражение, чтобы искать методы P / Invoke, но это будет немного другое отражение.
 Matt Warren20 авг. 2009 г., 16:10
Будет ли это также обнаруживать неуправляемые DLL, которые используются через PInvoke, или это только забрать управляет DLL?
 Matt Warren20 авг. 2009 г., 16:48
Как бы я это сделал? Мои знания об отражении ограничены, можете ли вы указать мне правильное направление?
Решение Вопроса

Assembly.GetReferencedAssemblies?

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

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

Ваш ответ на вопрос