Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

Создание ПО с плагинами

#c_sharp #delphi #plugin #desktop #рефлексия


По долгу службы требуется реализация довольно сложного десктопного ПО. Как одно из
требований — плагины (подключаемые модули), которые могут быть очень разнообразными:
от определения новых типов данных до работы с интерфейсом (добавление форм, кнопок
и т.п.). Разумеется, также требуются аналитика, обработка данных, сохранение в разные
БД и т.д.

Платформы для выбора — C# или Delphi (т.к. есть прототип, реализующий 90% потребного
функционала, но в режиме «спагетти»).

Если с Delphi всё понятно — средство загрузки/выгрузки плагинов делать руками, то
вот с C# не всё так прозрачно.

Пока что быстрый поиск показал следующие варианты:


MEF: довольно просто в реализации, но нельзя изолировать плагины в отдельных AppDomain
(что довольно-таки важно, это существенное архитектурное преимущество .NET вообще и
шарпа в частности);
MAF: переусложнено, замудрённо, и, с виду, уже не поддерживается. С другой стороны —
мощная изоляция;
самостоятельная реализация на reflection (например, так), с возможностью загрузки
в AppDomain и прочим. Но придётся много велосипедить, чего в общем-то не хочется.


Есть ещё варианты? Может, что-то не было учтено?

UPD: добавил ссылки.
    


Ответы

Ответ 1



Для C# есть встроенное готовое решение от Microsoft: System.Addin. Позволяет конфигурировать плагины так, чтобы использовать их в том же AppDomain'е, или в выделенном другом, или каждый в своём, или вообще в отдельном процессе. Не понимаю, почему везде советуют MEF. Это решение именно для расширяемости: код, который вы загружаете, считается доверенным и очень мало отличается от основного кода приложения, поэтому возможности выгрузки и управление правами напрочь отсутствуют. Самостоятельный велосипед на reflection написать можно, но придётся довольно серьёзно разбираться в тонкостях наподобие Fusion и Load context, так что я бы не советовал тратить время. Обновление: Ага, System.Addin — это то, что вы называете MAF.

Ответ 2



Зависит от специфических требований к вашей системе. Так ли нужна изоляция в отдельный домен? Если код ваших плагинов не предполагает взаимодействия с Native библиотеками, то и исключения, выбрасываемые из плагина, не поломают вашу программу целиком. Вы вполне можете их перехватить, по стеку установить плагин-виновник и предложить пользователю в следующий раз не загружать его. Ну да, не так круто, как в динамике выгрузить домен, но зато насколько меньше возни. Вот Студия же работает именно так. Ну а если ваши плагины способны нарушить работу процесса на уровне ОС, то ляжет весь процесс приложения вместе с CLR и доменами. Поэтому с MAF я бы не связывался. Что до остального, могу посоветовать Mono.Addins. По возможностям превосходит MEF. Документация есть, но не исчерпывающая. Примеров маловато. Также есть система ICSharpCode.Core, используемая в SharpDevelop, она тоже мощная, есть исходники (сам шарпдевелоп). Но документации почти нет, и она сильно устарела.

Комментариев нет:

Отправить комментарий