Получить зависимые сборки? - программирование
Подтвердить что ты не робот

Получить зависимые сборки?

Есть ли способ получить все сборки, которые зависят от данной сборки?

Псевдо:

Assembly a = GetAssembly();
var dependants = a.GetDependants();
4b9b3361

Ответ 1

Если вы хотите найти зависимые сборки из текущего домена приложения, вы можете использовать что-то вроде функции 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 представляет собой сборку, для которой вы хотите найти всех иждивенцев.

Ответ 2

Программно, вы можете использовать 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 может предоставить вам эту информацию.

Ответ 3

Сначала определите область видимости, например:

  • Все сборки в моем каталоге bin приложения

  • Все сборки в моем каталоге bin приложения + все сборки в GAC

  • Все сборки на любой машине в мире.

Затем просто (*) повторите все сборки в своей области и используйте отражение, чтобы проверить, зависят ли они от вашей целевой сборки.

Если вы хотите косвенные, а также прямые ссылки, вам придется промывать и повторять все найденные сборки.

(*) Не может быть так просто, если ваша область действия выше 3.

Ответ 4

Я не знаю никакой встроенной возможности для получения зависимостей во время выполнения. Поэтому я считаю, что самым простым решением является метод расширения и использование кода из этого приложения. Я использовал приложение уже несколько лет назад. Но не используйте его код.

Надеюсь, что это поможет.