Как получить имена 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();