Лучшие программисты прослеживают весь свой код в отладчике и тестируют все пути.
Хорошо... OP, сказанный спорный!
Вы смотрели 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);
}
System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies();
foreach (System.Reflection.Assembly a in ar)
{
Console.WriteLine("{0}", a.FullName);
}
Вы можете использовать AppDomain.GetAssemblies .
Но это даст ВСЕ сборки, используемые явно или неявно в вашем приложении.
Если у вас есть объект Assembly
, вы можете вызвать для него GetReferencedAssemblies ()
, чтобы получить любые ссылки, используемые сборкой. Чтобы получить список сборок, которые использует текущий проект, вы можете использовать:
System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()
Думаю, вы можете использовать:
AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies();