Как использовать Названия DLLs приложением

Лучшие программисты прослеживают весь свой код в отладчике и тестируют все пути.

Хорошо... OP, сказанный спорный!

14
задан Wai Ha Lee 14 January 2016 в 13:24
поделиться

6 ответов

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

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

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

14
ответ дан 1 December 2019 в 10:03
поделиться

Чтобы сделать это правильно, вам нужно пройтись по сборкам, выбрав зависимости ... если вашему 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);
    }
11
ответ дан 1 December 2019 в 10:03
поделиться
System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies();

foreach (System.Reflection.Assembly a in ar)
{
 Console.WriteLine("{0}", a.FullName);
}
2
ответ дан 1 December 2019 в 10:03
поделиться

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

0
ответ дан 1 December 2019 в 10:03
поделиться

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

System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()
0
ответ дан 1 December 2019 в 10:03
поделиться

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

AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies();
0
ответ дан 1 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: