Есть ли способ получить все сборки, которые зависят от данной сборки?
Псевдо:
Assembly a = GetAssembly();
var dependants = a.GetDependants();
Есть ли способ получить все сборки, которые зависят от данной сборки?
Псевдо:
Assembly a = GetAssembly();
var dependants = a.GetDependants();
Если вы хотите найти зависимые сборки из текущего домена приложения, вы можете использовать что-то вроде функции GetDependentAssemblies
, определенной ниже:
private IEnumerable<Assembly> GetDependentAssemblies(Assembly analyzedAssembly)
{
return AppDomain.CurrentDomain.GetAssemblies()
.Where(a => GetNamesOfAssembliesReferencedBy(a)
.Contains(analyzedAssembly.FullName));
}
public IEnumerable<string> GetNamesOfAssembliesReferencedBy(Assembly assembly)
{
return assembly.GetReferencedAssemblies()
.Select(assemblyName => assemblyName.FullName);
}
Параметр analyzedAssembly
представляет собой сборку, для которой вы хотите найти всех иждивенцев.
Программно, вы можете использовать Mono.Cecil для этого.
Что-то вроде этого (обратите внимание, что это не сработает, если отладчик подключен - например, если вы запустите его из самого VS):
public static IEnumerable<string> GetDependentAssembly(string assemblyFilePath)
{
//On my box, once I'd installed Mono, Mono.Cecil could be found at:
//C:\Program Files (x86)\Mono-2.10.8\lib\mono\gac\Mono.Cecil\0.9.4.0__0738eb9f132ed756\Mono.Cecil.dll
var assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath);
return assembly.MainModule.AssemblyReferences.Select(reference => reference.FullName);
}
Если вам не нужно делать это программно, то NDepend или Reflector может предоставить вам эту информацию.
Сначала определите область видимости, например:
Все сборки в моем каталоге bin приложения
Все сборки в моем каталоге bin приложения + все сборки в GAC
Все сборки на любой машине в мире.
Затем просто (*) повторите все сборки в своей области и используйте отражение, чтобы проверить, зависят ли они от вашей целевой сборки.
Если вы хотите косвенные, а также прямые ссылки, вам придется промывать и повторять все найденные сборки.
(*) Не может быть так просто, если ваша область действия выше 3.
Я не знаю никакой встроенной возможности для получения зависимостей во время выполнения. Поэтому я считаю, что самым простым решением является метод расширения и использование кода из этого приложения. Я использовал приложение уже несколько лет назад. Но не используйте его код.
Надеюсь, что это поможет.