Получить зависимые сборки? - PullRequest
17 голосов
/ 13 января 2012

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

Псевдо:

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

Ответы [ 4 ]

15 голосов
/ 13 января 2012

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

7 голосов
/ 13 января 2012

Программно, вы можете использовать Mono.Cecil для этого.

Что-то вроде этого (обратите внимание, это не будет работать, если отладчик подключен - например, если вы запускаете его изнутриСамо по себе):

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

2 голосов
/ 13 января 2012

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

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

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

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

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

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

(*) Может быть, все не так просто, если ваш объем выше 3.

1 голос
/ 13 января 2012

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

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

...