Мои проекты настраиваются как это:
"Потребительские" ссылки проекта и "Определение" и "Реализация", но статически не ссылается ни на какие типы в "Реализации".
Когда приложение запускается, Проект "Потребитель" называет статический метод в "Определении", которое должно найти типы в "Реализации"
Существует ли способ, которым я могу вынудить какой-либо блок, на который ссылаются, быть загруженным в Домен Приложения, не зная путь или имя, и предпочтительно не имея необходимость использовать законченную платформу МОК?
Похоже, это сработало:
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, имеет гораздо лучшие возможности для выполнения подобных задач.
Вы можете использовать Assembly.GetReferencedAssemblies
, чтобы получить AssemblyName []
, а затем вызвать Assembly.Load (AssemblyName)
для каждого из них. Вам, конечно, потребуется рекурсивно, но желательно отслеживать сборки, которые вы уже загрузили :)