#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, она тоже мощная, есть исходники (сам шарпдевелоп). Но документации почти нет, и она сильно устарела.
Комментариев нет:
Отправить комментарий