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

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

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

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

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

6 ответов

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

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

Я использовал 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);
 }
</assemblyname></assemblyname></string></string>


System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies();
foreach (System.Reflection.Assembly a in ar)
{
 Console.WriteLine("{0}", a.FullName);
}


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


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

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


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

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

licensed under cc by-sa 3.0 with attribution.