Я пытаюсь реализовать плагин как приложение. Я знаю, что уже существует несколько решений там, но это просто будет подтверждением концепции, ничто больше. Идея состояла бы в том, чтобы подать главное приложение заявки, почти невыразительное по умолчанию и затем сообщать плагинам друг о друге, имение их имеет, реализуют все необходимые опции.
Возникают несколько проблем:
Есть ли случайно какие-либо книги там, которые конкретно имеют дело с этими видами проектов для.NET?
Спасибо
править: Я думаю, что люди дрейфуют далеко от этих 2 вопросов, которые я сделал. Я могу смотреть и на MEF и на #develop, но я хотел бы получить ответы специфических особенностей на вопросы, которые я сделал.
Посмотрите в пространство имен System.AddIn
. Это немного более низкий уровень, чем MEF, и поэтому должен дать вам возможность «реализовать сам», которую вы ищете.
Рекомендую изучить MEF . Это новый способ создания надстроек в .NET. Это рекомендуемый способ создания новых надстроек, например, для VS2010. Сам я не использовал его, но то, что я изучил, выглядит отлично. Добавляя это как ответ на уговоры других:)
Есть хорошая книга по созданию того, что вы ищете: Анализ приложения C #: внутри SharpDevelop. Вот ссылка: http://www.icsharpcode.net/OpenSource/SD/InsideSharpDevelop.aspx
Приложение SharpDevelop полностью основано на плагинах, и в книге рассказывается о том, как они его создали, о подводных камнях, с которыми они столкнулись, и как они это преодолели. Книга находится в свободном доступе на сайте, или ее тоже можно купить.
Однажды я сделал это, используя этот пример. Мне понравилось, но это было пару лет назад, думаю, сейчас есть решения получше. Насколько я помню, основная идея была в том, что в вашей программе есть абстрактный класс, а ваши плагины наследуют этот класс и компилируются как DLL... или что-то подобное с использованием интерфейсов. В любом случае, этот подход отлично работал для меня. Позже я добавил наблюдателя за файловой системой, чтобы он мог загружать эти DLL-плагины во время работы программы.
По поводу двух выявленных вами конкретных проблем:
1) Я не уверен, чего вы пытаетесь достичь, но предполагаю, что вы хотите иметь ленивую инициализацию функций и, возможно, ленивую загрузку надстроек. Если это цель, то то, что вы предлагаете, может сработать. Таким образом, это могло бы работать следующим образом:
Однако, если плагин Y имеет прямой доступ к X API, я думаю, нет необходимости иметь всю эту инфраструктуру для регистрации функций. Y может просто получить доступ к функциям X, напрямую используя X API, а Y позаботится о ленивой инициализации каждой функции при необходимости. Например, Y может просто вызвать SomeXFeature.DoSomething (), и реализация этого класса инициализирует функцию при первом ее использовании.
2) Если API сборки изменится, любая сборка, зависящая от нее, может сломаться. Плагины - это просто сборки, которые зависят от других сборок, поэтому они также сломаются. Вот несколько советов, которые помогут решить эту проблему.
Подобные решения используются фреймворком Mono.Addins . В Mono.Addins каждая надстройка имеет номер версии и список надстроек / версий, от которых она зависит. При загрузке надстройки механизм надстройки обеспечивает загрузку всех зависимых надстроек с правильными версиями. Он также предоставляет API и инструмент командной строки для управления установкой надстроек.