Существует ли способ вынудить все блоки, на которые ссылаются, быть загруженными в домен приложения?

Мои проекты настраиваются как это:

  • Проект "Определение"
  • Проект "Реализация"
  • Проект "Потребитель"

"Потребительские" ссылки проекта и "Определение" и "Реализация", но статически не ссылается ни на какие типы в "Реализации".

Когда приложение запускается, Проект "Потребитель" называет статический метод в "Определении", которое должно найти типы в "Реализации"

Существует ли способ, которым я могу вынудить какой-либо блок, на который ссылаются, быть загруженным в Домен Приложения, не зная путь или имя, и предпочтительно не имея необходимость использовать законченную платформу МОК?

71
задан abatishchev 10 October 2014 в 19:52
поделиться

2 ответа

Похоже, это сработало:

        var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
        var loadedPaths = loadedAssemblies.Select(a => a.Location).ToArray();

        var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
        var toLoad = referencedPaths.Where(r => !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList();
        toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));

Как заметил Джон, идеальное решение должно было бы рекурсивно перейти к зависимостям для каждой из загруженных сборок, но в моем конкретном сценарии мне не нужно об этом беспокоиться.


Обновление: Платформа управляемой расширяемости (System.ComponentModel), включенная в .NET 4, имеет гораздо лучшие возможности для выполнения подобных задач.

80
ответ дан 24 November 2019 в 12:56
поделиться

Вы можете использовать Assembly.GetReferencedAssemblies , чтобы получить AssemblyName [] , а затем вызвать Assembly.Load (AssemblyName) для каждого из них. Вам, конечно, потребуется рекурсивно, но желательно отслеживать сборки, которые вы уже загрузили :)

55
ответ дан 24 November 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: