Что, когда assembly.GetReferencedAssemblies возвращает зависимость ".exe"? - PullRequest
2 голосов
/ 19 октября 2010

Есть много примеров, как загрузить все зависимости из некоторой сборки, например:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
foreach (var assemblyName in assembly.GetReferencedAssemblies()) {
  try {
    Assembly.ReflectionOnlyLoad(assemblyName.FullName);
  } catch {
    Assembly.ReflectionOnlyLoadFrom(Path.Combine(Path.GetDirectoryName(assemblyPath), assemblyName.Name + ".dll"));
  }
}

, но что, если одна из зависимостей не ".dll", а ".exe"?Нужно ли для этой сборки «.exe» повторно вызывать GetReferencedAssemblies () в цикле foreach?Есть ли опасность получения круговой зависимости?

br, Милан

Ответы [ 4 ]

4 голосов
/ 19 октября 2010

Вы должны быть в состоянии использовать EXE, как и любой другой DLL.У него просто есть дополнительный бонус, который он может выполнять отдельно.

2 голосов
/ 19 октября 2010

Сборка, которая является dll, так же, как и exe, может иметь ссылки на другие сборки;с этой точки зрения нет никакой разницы между ними.

0 голосов
/ 18 февраля 2015

Как уже упоминалось, вы можете рассматривать .exe как .dll с точки зрения ссылок.

Что касается беспокойства о циклических ссылках, скомпилируются ли эти библиотеки, если таковые имеются? Просто мысль.

Вот небольшой рекурсивный код для получения всех зависимых сборок:

    private static IEnumerable<Assembly> GetAllDependencies(Assembly assembly)
    {
        var dict = new Dictionary<string, AssemblyName>();
        dict.Add(assembly.GetName().FullName, assembly.GetName());
        dict = GetAllDependenciesRecursive(assembly.GetName(), dict);
        return dict.Select(d => Assembly.Load(d.Value)).ToArray();
    }

    private static Dictionary<string, AssemblyName> GetAllDependenciesRecursive(AssemblyName assemblyName, Dictionary<string, AssemblyName> existingRefList)
    {
        var assembly = Assembly.Load(assemblyName);
        List<AssemblyName> a = assembly.GetReferencedAssemblies().ToList();
        foreach (var refAssemblyName in a)
        {
            if (!existingRefList.ContainsKey(refAssemblyName.FullName))
            {
                existingRefList.Add(refAssemblyName.FullName, refAssemblyName);
                existingRefList = GetAllDependenciesRecursive(refAssemblyName, existingRefList);
            }
        }
        return existingRefList;
    }
0 голосов
/ 19 октября 2010

GetReferencedAssemblies () не возвращает все дерево зависимостей (dll или exe не имеют значения), поэтому вам понадобится решение, которое пересекает дерево.Смотрите эту статью http://msdn.microsoft.com/en-us/magazine/cc163641.aspx.

...