Чтобы решить эту проблему, я установил событие после сборки каждого проекта в папке решения, чтобы скопировать его сборку в папку bin в папке bin основных проектов.
Событие пост-сборки было установлено так:
copy "$(TargetPath)" "$(SolutionDir)MainProjectName\bin"
Затем я использовал следующее для извлечения имен файлов сборок из этого каталога bin (благодарность Дарину за его пост решения здесь ):
string[] assemblyFiles = Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), "*.dll");
Затем я получил реализации объектов, реализующих интерфейс ISettings, используя:
IEnumerable<ISettings> configuration = assemblyFiles.Select(f => Assembly.LoadFrom(f))
.SelectMany(a => a.GetTypes())
.Where(t => t.GetInterfaces().Contains(typeof(ISettings)) && t.GetConstructor(Type.EmptyTypes) != null)
.Select(t => (ISettings)Activator.CreateInstance(t));
Это позволяет мне добавлять другие проекты, которые реализуют настройки, без перекомпиляции основного проекта.
Кроме того, я рассмотрел одну альтернативу: MEF
, где можно найти введение здесь .